2013-01-22 80 views
3

我目前有以下模型,其中有Product類,其中有許多Ratings。每個Rating都有一個date_created DateTime字段和一個stars字段,它是一個從1到10的整數。有沒有辦法將所有日期的某一天所有產品的星星總數加起來?Django:跨子模塊彙總字段

例如,在12月21日,共有543顆星給予所有產品(即項目A的200個,項目B的10個,項目C的233個)。第二天,可能會有0顆星,因爲任何產品都沒有評分。

我可以想象得到一個日期列表,然後過濾每個日期,並聚合每個日期,但這似乎非常密集。有更容易的方法嗎?

回答

1

你會想要使用Django的aggregation functions;具體而言,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模型的成員,因此您可以直接對其進行查詢。

2

你應該能夠做到這一切在一個查詢,使用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" 
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]