举个例子: 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?
答案 0 :(得分:22)
您可以在过滤器中使用注释变量。
publishers=Publisher.objects.annotate(num_books=Count('book')).filter(num_books__gte=2)
答案 1 :(得分:11)
嗯,我认为你必须使用extra clause:
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'
})
答案 2 :(得分:6)
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,
)
答案 3 :(得分:1)
开始的Django 2.0人们可以使用filter
聚合函数的参数:
from django.db.models import Q
Publisher.objects.annotate(num_books=Count('book', filter=Q(book__rating__gt=3.0)))
答案基于cheat sheet。
答案 4 :(得分:0)
您可以尝试以下内容:
Book.objects.values('publisher').annotate(num_books=Count('id'))
答案 5 :(得分:0)
我只是面对这种问题。如果我对问题的解释和预期的解决方案是正确的,这是我的工作解决方案:
Publisher.objects.annotate(num_books=Count('book')).filter(book__rating__gt=3.0)
只需更换过滤器&amp;注释位置。这是在Django 1.9版本中完成的。