Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:跨子模型字段聚合_Python_Django - Fatal编程技术网

Python Django:跨子模型字段聚合

Python Django:跨子模型字段聚合,python,django,Python,Django,我目前有以下型号,其中有一个产品类,它有许多评级。每个Rating都有一个date\u创建的DateTime字段和一个stars字段,该字段是1到10之间的整数。有没有一种方法可以让我把某一天所有产品的星星总数加起来 例如,12月21日,所有产品总共获得543颗星(即A项200颗星,B项10颗星,C项233颗星)。第二天,可能会有0颗星,因为没有任何产品的评级 我可以想象,首先得到一个日期列表,然后对每个日期进行过滤,并聚合每个日期,但这似乎非常密集。有更简单的方法吗?你会想用Django的;具

我目前有以下型号,其中有一个
产品
类,它有许多
评级
。每个
Rating
都有一个
date\u创建的
DateTime字段和一个
stars
字段,该字段是1到10之间的整数。有没有一种方法可以让我把某一天所有产品的星星总数加起来

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


我可以想象,首先得到一个日期列表,然后对每个日期进行过滤,并聚合每个日期,但这似乎非常密集。有更简单的方法吗?

你会想用Django的;具体来说


作为补充说明,您的场景实际上根本不需要使用任何子模型。由于创建的
日期
字段和
星星
字段都是
评级
模型的成员,因此您可以直接对其进行查询。

您应该能够使用
值在一次查询中完成所有操作:

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子句省略):


您始终可以执行一些原始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]
SELECT "myapp_ratings"."date_created", SUM("myapp_ratings"."stars") AS "total" FROM "myapp_ratings" GROUP BY "myapp_ratings"."date_created"
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]