在特定字段上混合Count,Case和Distinct

时间:2017-01-06 12:33:59

标签: django

我有以下型号:

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的查询也是如此。

1 个答案:

答案 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的行。