如何在Django ORM中执行GROUP BY ... COUNT或SUM?

Joh*_*fis 6 python django group-by django-orm

序幕:

这是SO中经常出现的问题:

我已经在SO文档中编写了一个示例,但由于文档将于2017年8月8日关闭,我将遵循这个广泛上升和讨论的元答案的建议,并将我的示例转换为自我回答的帖子.

当然,我也很乐意看到任何不同的方法!


题:

假设模型:

class Books(models.Model):
    title  = models.CharField()
    author = models.CharField()
    price = models.FloatField()
Run Code Online (Sandbox Code Playgroud)

如何使用Django ORM在该模型上执行以下查询:

Joh*_*fis 17

我们可以进行一个GROUP BY ... COUNT或者一个GROUP BY ... SUM在Django的ORM SQL的等效查询,使用的annotate(),values()django.db.modelsCountSum恭敬的方法和可选的order_by()方法:

  • 这对我有用:statement_line.objects.filter(pay_date__lt='2019-10-31').select_lated('ae').values('ae__opp_own').annotate(tots=Sum('amt')).filter (tots__gt=0) 关键是选择相关和父字段名称的双下划线。第二个过滤器确实转向“具有”。str([obj].query) 证实了这一点。另一个方便的东西。 (2认同)
  • 也许应该强调“order_by(...)”部分。如果模型使用不同的列进行排序,省略 order_by() 子句将导致聚合失败。 (2认同)