Суммируйте наибольшие значения каждого дня из периода с Django Query - PullRequest
0 голосов
/ 23 марта 2019

У моего проекта есть модель, которая выглядит следующим образом:

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

И мое приложение создает несколько сотен журналов этой модели в день.

Я пытаюсь суммировать только самые большие значения каждого дня без необходимости их перебирать (используя только запросы Django).

Возможно ли это без написания запросов SQL?

PS: я могу получать самые большие «данные» каждого дня, поэтому текущая логика повторяется по дням и суммирует самые большие значения каждого дня.Но это решение становится слишком медленным, и я хотел бы решить его непосредственно на уровне БД.

Ответы [ 2 ]

3 голосов
/ 23 марта 2019

Аннотации и агрегаты для спасения:

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 голосов
/ 23 марта 2019

Если вы используете базу данных с поддержкой distinct для полей (как это делает postgres), вы можете это сделать.

Data.objects.order_by('created_at__date', '-data').distinct('created_at__date')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...