使用Django Query从句点中总结每天的最大值

问题描述 投票:0回答:2

我的项目有一个模型,如:

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

我的应用程序每天创建几百个此模型的日志。

我试图只计算每一天的最大值,而不必迭代它们(仅使用Django查询)。

没有编写SQL查询是否可能?

PS:我能够获得每天最好的'数据',所以当前的逻辑迭代了几天,并且总结了每天的最大值。但是这个解决方案变得太慢了,我想直接解决它到db级别。

django django-models django-queryset django-orm
2个回答
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

0
投票

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

Data.objects.order_by('created_at__date', '-data').distinct('created_at__date')
© www.soinside.com 2019 - 2024. All rights reserved.