Взяв пример из: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#filter-and-exclude
Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book'))
В любом случае можно ли применить фильтр только к аннотации, поэтому он вернет всех издателей, причем некоторые из них имеют num_books = 0?
Вы можете использовать переменную аннотации в фильтре.
publishers=Publisher.objects.annotate(num_books=Count('book')).filter(num_books__gte=2)
Хм, я думаю, вы должны использовать дополнительный пункт :
Publisher.objects.extra(select={ 'num_books': 'SELECT COUNT(*) ' + \ 'FROM <your_app>_book ' + \ 'WHERE <your_app>_book.publisher_id = ' + \ '<your_app>_publisher.id AND ' + \ 'rating > 3.0' })
from django.db import models Publisher.objects.annotate( num_books=models.Sum( models.Case( models.When( book__rating__gt=3.0, then=1, ), default=0, output_field=models.IntegerField(), ) ) ).filter( num_books=0, )
При запуске Django 2.0 можно использовать filter параметр функции агрегирования:
filter
from django.db.models import Q Publisher.objects.annotate(num_books=Count('book', filter=Q(book__rating__gt=3.0)))
Ответ основан на шпаргалке .
Я просто столкнулся с такой проблемой.И если моя интерпретация проблемы и ожидаемого решения верна, то это мое рабочее решение: Publisher.objects.annotate(num_books=Count('book')).filter(book__rating__gt=3.0) Просто поменяйте местами фильтр и аннотируйте положениеЭто сделано в Django версии 1.9
Publisher.objects.annotate(num_books=Count('book')).filter(book__rating__gt=3.0)
Вы можете попробовать что-то вроде:
Book.objects.values('publisher').annotate(num_books=Count('id'))