使用Django Query汇总时段中每天的最大值

时间:2019-03-23 14:02:43

标签: django django-models django-queryset django-orm

我的项目的模型如下:

class Data(Model):
    data = FloatField(verbose_name='Data', null=True, blank=True)
    created_at = DateTimeField(verbose_name='Created at')

我的应用每天创建这种模型的几百条日志。

我试图仅求和每天的最大值,而不必遍历它们(仅使用Django查询)。

是否可以不编写SQL查询?

PS:我每天都能获取最大的“数据”,因此当前逻辑会在几天内迭代并求和每天的最大值。但是该解决方案变得太慢了,我想直接将其解决到数据库级别。

2 个答案:

答案 0 :(得分:3)

解救的注释和汇总:

from django.db.models import Sum, Max
from django.db.models.functions import Trunc

report = (Data.objects
    .annotate(day=Trunc('created_at', 'day'))
    .values('day')
    .annotate(greatest=Max('data'))
    .values('greatest')
    .aggregate(total=Sum('greatest'))
)

print(report['total'])

生成的SQL比代码几乎简单:

SELECT SUM("greatest")
FROM
  (SELECT MAX("app_data"."data_id") AS "greatest"
   FROM "app_data"
   GROUP BY DATE_TRUNC('day', "app_data"."created_at")) subquery

答案 1 :(得分:0)

如果您使用的数据库支持字段上的distinct(如postgres一样),就可以这样做。

Data.objects.order_by('created_at__date', '-data').distinct('created_at__date')