我有以下型号:
class NoteLink(models.Model):
note_source = models.ForeignKey(Note, related_name="links_sourced")
note_target = models.ForeignKey(Note, related_name="links_targeting")
author = models.ForeignKey(User, related_name="links_created")
is_public = models.BooleanField(default=False)
我想计算一个公开的注释链接数量,所以我有以下注释:
Note.objects.annotate(public_links=Count(Case(
When(links_sourced__is_public=True, then=1),
output_field=IntegerField()))
)
问题是,有几个用户可以创建具有相同源和目标的链接,如果作者不同,这将计算具有相同源和目标的链接几次。我想只计算具有独特note_source和note_target的链接。
我知道Count
有一个distinct=True
选项。但是如何将它与我的Case
混合以考虑除了作者之外的所有链接都不相同的链接?或者换句话说,如何只计算具有不同note_target的那些?
N.B:我没有使用PostgreSQL而是使用MySQL,因此我无法在特定字段上运行distinct()。
编辑:我对计算单独的变量或查询不感兴趣。我需要这个值来注释我的所有笔记。
Edit2:我的目标是将值注释到我将在我的代码中进一步使用的查询中。不只是计算不同的音符数量。我已经知道不同的方法。我需要的是使用字段“public_links”注释Note.objects.all()并在我的代码中稍后使用相同的查询。包含不同公共链接数量的单独查询对我来说是不可用的。对于不包含所有Notes的查询也是如此。
答案 0 :(得分:0)
这可能会对您有所帮助: -
from django.db.models import Count
distinctNoteCount = Note.objects.filter(is_public=True).annotate(the_count=Count('note_source ',distinct = True))
你可以在note_source或note_target上区分,因为我认为在你的情况下,你只想要计数应该是包含不同的note_source和note_target的行。