3

我目前有以下模型,其中有一个Product类,其中有很多Ratings. 每个Rating都有一个date_createdDateTime 字段和一个stars字段,该字段是从 1 到 10 的整数。有没有办法可以将某一天所有产品的星级总数相加?

例如,在 12 月 21 日,所有产品总共获得了 543 颗星(即 A 项为 200 颗星,B 项为 10 颗星,C 项为 233 颗星)。第二天,可能会有 0 颗星,因为没有任何产品的评分。

我可以想象首先获取日期列表,然后过滤每个日期,然后汇总每个日期,但这似乎非常密集。有没有更简单的方法?

4

3 回答 3

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"
于 2013-01-22T01:22:29.107 回答
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 回答
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 回答