4
Car.objects.all() # 5 cars in db, every car costs 1000 $

Car.objects.all().aggregate(Sum("price")) # result: 5000

# aggregate only on a subset

Car.objects.all()[3:].aggregate(Sum("price")) # result: 5000!, not 3000

# with filter()[3:] i got the same results!

为什么?切片不在数据库中评估?

我怎样才能用聚合来实现呢?

4

2 回答 2

6

似乎不可能在切片上使用聚合,因为这个开放票建议:https ://code.djangoproject.com/ticket/12886

一种解决方案是执行两个不同的查询。第一个检索 Cars 的子集,第二个实际执行聚合:

qs = Car.objects.all()[:3]
sub_sum = Car.objects.filter(pk__in=qs).aggregate(Sum("price"))
于 2013-03-02T15:01:24.613 回答
4

aggregate通过修改发送到数据库的查询来工作,导致在数据库端发生聚合。你有两个选择。

  1. 您可以filter在使用之前减少 QuerySet aggregate,而不是通过切片来减少它。
  2. 您必须在 Python 中进行聚合,例如sum(car.price for car in cars)在切片之后。切片后,查询将发送到数据库,因此您不能再通过 ORM(即 QuerySet 方法)进行聚合。
于 2013-03-02T14:30:55.737 回答