Как отфильтровать / исключить неактивные комментарии из моего аннотированного запроса Django?


Я использую общее представление object_list, чтобы быстро перечислить набор статей. К каждой статье прилагаются комментарии. Запрос использует аннотацию к Count() количеству комментариев, а затем order_by() это аннотированное число.

'queryset': Article.objects.annotate(comment_count=Count('comments')).order_by('-comment_count'),
Комментарии являются частью структуры django.contrib.comments и присоединяются к модели через родовое отношение. Я добавил явный обратный поиск к моей модели статьи:
class Article(models.Models):
   ...
   comments = generic.GenericRelation(Comment, content_type_field='content_type', object_id_field='object_pk')
Проблема в том, что это подсчитывает "неактивные" комментарии; те, которые имеют is_public=False или is_removed=True. Как я могу исключить любые неактивные комментарии из подсчета?
1 5

1 ответ:

Документация по агрегациямобъясняет, как это сделать. Вам нужно использовать предложение filter, убедившись, что вы ставите его после предложения annotate:

Article.objects.annotate(comment_count=Count('comments')).filter(
     comment__is_public=True, comment__is_removed=False
).order_by('-comment_count')