如何在django-queryset中过滤带注释的数据

时间:2016-02-15 10:51:26

标签: python django django-models django-queryset

我想计算批准的评论数量?

news_list = News.objects.all()\
    .annotate(
        comments_count=Count(
            'comments__id', 
            comments__status=COMMENT_STATUS_APPROVED
        )
    )

但Count-function的第二个条件不起作用。如何过滤注释函数

1 个答案:

答案 0 :(得分:2)

how to annotate a count with a condition上有一个类似的问题,详细解答和解释SQL。

可以使用conditional aggregation执行conditional expression Case。文档中的示例显示了对单个模型的操作,但您可以使用常规方法进行模型间关系。以下QuerySet应该是您正在寻找的 -

class NewsQuerySet(models.QuerySet):
    def with_comment_counts(self):
        query = self
        query = query.annotate(
            comment_count=Sum(
                Case(When(comment__status=COMMENT_STATUS_APPROVED, then=1
                          default=0,
                          output_field=IntegerField())
            ),
        return query