仅过滤Django中的Annotations

时间:2010-01-19 19:52:39

标签: django orm

举个例子: 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?

6 个答案:

答案 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版本中完成的。