【问题标题】:Django queryset: aggregate after slicing the queryset doesn't workDjango查询集:切片查询集后聚合不起作用
【发布时间】:2013-03-02 14:23:45
【问题描述】:
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 中求值?

我如何使用聚合来实现?

【问题讨论】:

    标签: python django aggregate slice django-queryset


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-04
        • 2010-10-30
        • 1970-01-01
        • 2014-02-23
        • 2011-08-24
        • 2023-01-22
        • 1970-01-01
        • 2016-04-13
        相关资源
        最近更新 更多