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


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?

如何使用aggregate实现这一目标?

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

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

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

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

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

从Django 1.7(早在2014年)开始,你可以聚合一个切片。

相关内容

  • 没有找到相关文章

最新更新