3

私は現在、次のモデルを持っています。ここには、Product多くのクラスがあるクラスがありRatingsます。それぞれRatingdate_createdDateTime フィールドと、stars1 から 10 までの整数であるフィールドがあります。特定の日にすべての製品に付けられた星の総数をすべての日に合計する方法はありますか?

たとえば、12 月 21 日、すべての製品に合計 543 個の星が付けられました (つまり、アイテム A に 200 個、アイテム B に 10 個、アイテム C に 233 個)。翌日には、どの製品にも評価がないため、星が 0 になる場合があります。

最初に日付のリストを取得し、次に各日付でフィルター処理して、それぞれを集計することは想像できますが、これは非常に集約的です。もっと簡単な方法はありますか?

4

3 に答える 3

2

次を使用して、1つのクエリですべてを実行できるはずですvalues

from datetime import date, timedelta
from django.db.models import Sum

end_date = date.now()
start_date = end_date - timedelta(days=7)

qs = Rating.objects.filter(date_created__gt=start_date, date_created__lt=end_date)
qs = qs.values('date_created').annotate(total=Sum('stars'))

print qs

次のような出力が必要です。

[{'date_created': '1-21-2013', 'total': 150}, ... ]

そのための SQL は次のようになります (WHERE 句は省略されています)。

SELECT "myapp_ratings"."date_created", SUM("myapp_ratings"."stars") AS "total" FROM "myapp_ratings" GROUP BY "myapp_ratings"."date_created"
于 2013-01-22T01:22:29.107 に答える
1

Django の集計関数を使用する必要があります。具体的には、Sum.

>>> from django.db.models import Sum
>>>
>>> date = '2012-12-21'
>>> Rating.objects.filter(date_created=date).aggregate(Sum('stars'))
{'stars__sum': 543}

補足として、シナリオでは実際にはサブモデルをまったく使用する必要はありません。date_createdフィールドとstarsフィールドはどちらもモデルのメンバーであるため、直接Ratingクエリを実行できます。

于 2013-01-22T01:06:02.680 に答える
1

いつでも生の SQL を実行できます。

from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute('SELECT date_created, SUM(stars) FROM yourapp_rating GROUP BY date_created')
result = cursor.fetchall()  # looks like [('date1', 'sum1'), ('date2', 'sum2'), etc]
于 2013-01-22T01:27:10.033 に答える