Django queryset:切片后的聚合查询集不起作用

时间:2013-03-02 14:23:45

标签: python django aggregate slice django-queryset

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!

为什么呢?在db?

中不评估切片

如何通过聚合实现这一目标?

2 个答案:

答案 0 :(得分:4)

aggregate通过修改发送给DB的查询来工作,从而导致在DB端发生聚合。你有两个选择。

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

答案 1 :(得分:3)

似乎无法在切片上使用聚合,因为此打开的故障单建议:https://code.djangoproject.com/ticket/12886

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

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