Python Django queryset:切片queryset后的聚合不';行不通

Python Django queryset:切片queryset后的聚合不';行不通,python,django,aggregate,slice,django-queryset,Python,Django,Aggregate,Slice,Django Queryset,为什么??切片不以db计算 如何使用聚合实现这一点?aggregate的工作原理是修改发送到数据库的查询,从而在数据库端进行聚合。你有两个选择 在使用聚合之前,您可以使用过滤器来减少查询集,而不是通过切片来减少查询集 在切片之后,您必须用Python进行聚合,例如,sum(car.price用于car-in-cars)。切片后,查询将发送到数据库,因此您不能再通过ORM进行聚合(即QuerySet方法) 似乎不可能在切片上使用聚合,因为此公开票证表明: 一种解决方案是执行两个不同的查询。第一个用

为什么??切片不以db计算


如何使用聚合实现这一点?

aggregate
的工作原理是修改发送到数据库的查询,从而在数据库端进行聚合。你有两个选择

  • 在使用
    聚合
    之前,您可以使用
    过滤器
    来减少查询集,而不是通过切片来减少查询集
  • 在切片之后,您必须用Python进行聚合,例如,
    sum(car.price用于car-in-cars)
    。切片后,查询将发送到数据库,因此您不能再通过ORM进行聚合(即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!
    
    qs = Car.objects.all()[:3]
    sub_sum = Car.objects.filter(pk__in=qs).aggregate(Sum("price"))