Django ORM中的SumIf(条件求和)

时间:2014-10-26 15:41:15

标签: python django django-models aggregate-functions

我有两个模型:Publisher和Book。

我正在使用

检索发布商
Publisher.objects.filter(name="A").annotate(total_pages=Sum('books__num_pages'))

但我只对2014年写的书籍总页数感兴趣。

我不熟悉在Django中制作SUMIF的任何选项。其他人如何解决这个问题?

我认为应该有可能做一些像

这样的事情
Sum('books__num_pages', where={'year': 2014})

或类似的东西。

2 个答案:

答案 0 :(得分:1)

books_num_pages = Books.objects.filter(publisher__name='A', year=2014).aggregate(Sum('num_pages'))

答案 1 :(得分:1)

你非常接近实际的正确解决方案(或者也许django在2014年没有它?),Sum function has a filter参数,所以你可以这样做:

from django.db.models import Sum, Q
...
Publisher.objects.filter(name="A").annotate(total_pages=Sum('books__num_pages'), filter=Q(year=2014))