如何将每个日期时间间隔 MySQL 查询的平均值重写为 Django QuerySet?

How can I rewrite an average value per date time interval MySQL query as a 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条记录:

item_id date_time some_value
1 2021-11-29 00:11:01 10
2 2021-11-29 00:16:15 20
3 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 获得相同的输出。

作为参考,我的 Django 模型如下所示:

class SomeModel(models.Model):
    item_id = models.AutoField(primary_key=True)
    some_value = models.FloatField()
    date_time = models.DateTimeField(auto_now=True)

这是我当前的查询集:

(SomeModel.objects
    .annotate(interval_date_time=F("date_time"))
    .values("interval_date_time")
    .annotate(avg_value=Avg("some_value"))
    .order_by("interval_date_time")
)

我认为我需要对第一个注释方法调用进行更改。任何帮助将不胜感激,因为我对 Django 还很陌生。

如果您知道您将始终使用 MySQL,那么在这里使用 RawSQL 可能是最简单的。

(
    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")
)