注释SQL函数到Django ORM查询集`FUNC``AGGREGATE`。

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

我正试图做一些非常类似的事情。为Django ORM Queryset注释自定义SQL函数(类似于date_trunc)。

但却发现解决的方法不够。

使用前面链接中的相同例子,假设我们有一个Django模型是这样的。

class Measurement(models.Model):

    device_id = models.IntegerField(primary_key=True)
    time = models.DateTimeField()
    s0 = models.FloatField(blank=True, null=True)
    s1 = models.FloatField(blank=True, null=True)

我们正试图在ORM中利用以下内容。

SELECT
  time_bucket('1 minute', time) AS tb,
  AVG(s0) 
FROM measurements
WHERE
  time >= to_timestamp(1) AND
  time <= to_timestamp(2)
GROUP BY tb
ORDER BY tb ASC;

我们有一个成功的自定义功能,如。

class TimeBucket(Func):

    function = 'time_bucket'
    template = '%(function)s(\'{bucket_width}\', %(expressions)s)'.format(bucket_width='1 minute')

但我们看到,运行一个类似下面的查询。

qs = (
    Measurement.objects
    .filter(...)
    .annotate(tb=TimeBucket('time'))
    .values('tb')
    .annotate(s_desc=Avg('s0'))
    .order_by('tb')
)

并检查其相应的 qs.query 将永远包括 time GROUP BY查询中。I 只是 要分组 tb,派生值,如原SQL中所示。据我所知,你只需要使用 values('tb') 就像我们上面的分组一样 tb但Django似乎是将其附加到了 time 不知为何。为什么会出现这种情况呢?

是不是我的问题不在于这个外部函数,而在于我想通过计算字段来分组?

python django postgresql orm timescaledb
© www.soinside.com 2019 - 2024. All rights reserved.