我目前有以下模型,其中有一个Product
类,其中有许多Ratings
。每个Rating
都有一个date_created
DateTime字段和一个stars
字段,这个字段是1到10之间的整数。有没有办法可以累加给所有人的星号总数某一天的产品,所有的日子?
例如,在12月21日,共有543颗星给予所有产品(即A项200,B项10项,C项233项)。在第二天,可能会有0星,因为没有任何产品的评级。
我可以想象首先获取日期列表,然后过滤每个日期,并聚合每个日期,但这似乎非常密集。有更简单的方法吗?
答案 0 :(得分: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 :(得分: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 :(得分: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]