Django ORM 中的 SumIf(条件总和)

Jam*_*een 5 python django aggregate-functions django-models

我有两个模型:Publisher 和 Book。

我正在检索发布商

Publisher.objects.filter(name="A").annotate(total_pages=Sum('books__num_pages'))
Run Code Online (Sandbox Code Playgroud)

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

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

我认为应该有一些可能性做类似的事情

Sum('books__num_pages', where={'year': 2014})
Run Code Online (Sandbox Code Playgroud)

或类似的东西。

rad*_*doh 7

您非常接近实际的正确解决方案(或者也许 django 在 2014 年没有它?),Sum函数有一个filter参数,因此您可以执行以下操作:

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

  • 我认为这个解决方案有点不正确,过滤器应该在 Sum() 中,即 Publisher.objects.filter(name="A").annotate(total_pages=Sum('books__num_pages', filter=Q(year=2014))) (2认同)

mad*_*han 1

books_num_pages = Books.objects.filter(publisher__name='A', year=2014).aggregate(Sum('num_pages'))
Run Code Online (Sandbox Code Playgroud)