2016-02-15 1 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