4
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でそれを達成できますか?

4

2 に答える 2

6

このオープンチケットが示唆しているように、スライスに集計を使用することはできないようです:https ://code.djangoproject.com/ticket/12886

1つの解決策は、2つの異なるクエリを実行することです。1つ目はCarsのサブセットを取得し、2つ目は実際に集計を実行します。

qs = Car.objects.all()[:3]
sub_sum = Car.objects.filter(pk__in=qs).aggregate(Sum("price"))
于 2013-03-02T15:01:24.613 に答える
4

aggregateDBに送信されるクエリを変更して、DB側で集計を実行することで機能します。2つの選択肢があります。

  1. スライスして削減する代わりに、 filterを使用する前にQuerySetを削減するために使用できます。aggregate
  2. sum(car.price for car in cars)スライス後など、Pythonで集計を行う必要があります。スライスすると、クエリがデータベースに送信されるため、ORM(つまり、QuerySetメソッド)を介して集計することはできなくなります。
于 2013-03-02T14:30:55.737 に答える