2013-03-02 115 views
2
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! 

为什么?切片不在数据库中评估?Django的查询集:聚合切片查询集后不工作

我怎样才能实现聚合?

回答

3

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

  1. 您可以使用filter使用aggregate前减少,而不是切片,以减少它的查询集。
  2. 你必须在Python中进行聚合,例如切片后的sum(car.price for car in cars)。一旦分片,查询就会发送到数据库,因此您不能再通过ORM进行聚合(即QuerySet方法)。
2

现在看来,这是不可能的切片,因为这公开售票使用聚合提示:https://code.djangoproject.com/ticket/12886

一种解决办法是执行两个不同的查询。第一个检索汽车子集和第二个实际执行聚合:

qs = Car.objects.all()[:3] 
sub_sum = Car.objects.filter(pk__in=qs).aggregate(Sum("price"))