Как я могу переписать запрос MySQL со средним значением на временной интервал по дате как Django QuerySet
У меня есть следующий запрос MySQL, который выводит среднее значение за 10-минутный интервал:
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(date_time) / 600) * 600) AS interval_date_time,
AVG(some_value) AS avg_value
FROM djangoapp_somemodel
GROUP BY interval_date_time
ORDER BY interval_date_time;
Например, если у меня есть следующие 3 записи:
date_time | some_value |
---|---|
2021-11-29 00:11:01 | 10 |
2021-11-29 00:16:15 | 20 |
2021-11-29 00:24:32 | 25 |
Запрос выдаст следующее:
interval_date_time | avg_value |
---|---|
2021-11-29 00:10:00 | 15 |
2021-11-29 00:20:00 | 25 |
Я подозреваю, что запрос не настолько эффективен, но я хочу получить тот же результат, используя Django QuerySet.
Вот что у меня есть на данный момент:
(SomeModel.objects
.annotate(interval_date_time=F("date_time"))
.values("interval_date_time")
.annotate(avg_value=Avg("some_value"))
.order_by("interval_date_time")
)
Я полагаю, что мне нужно внести изменения в первый вызов метода annotate. Любая помощь будет оценена по достоинству, поскольку я совсем новичок в Django.
Возможно, проще всего просто использовать RawSQL
здесь, если вы знаете, что всегда будете работать с MySQL.
(
SomeModel.objects.annotate(interval_date_time=RawSQL("FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(date_time) / 600) * 600)"))
.values("interval_date_time")
.annotate(avg_value=Avg("some_value"))
.order_by("interval_date_time")
)