2016-02-15 85 views
1

我想計算已批准的評論數?如何在django-queryset中過濾帶註釋的數據

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

但是Count函數的第二個條件不起作用。如何過濾註釋功能

+0

在註釋上過濾在Django中是不可能的。您將不得不使用自定義SQL。此博客條目可能有用:https://timmyomahony.com/blog/filtering-annotations-django/ – Leistungsabfall

+0

@Leistungsabfall感謝您的鏈接!我改變了我的查詢集以使用額外選擇。 – Dmitry

回答

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