Python 将SQL函数注释为Django ORM Queryset`FUNC`/`AGGREGATE`

Python 将SQL函数注释为Django ORM Queryset`FUNC`/`AGGREGATE`,python,django,postgresql,orm,timescaledb,Python,Django,Postgresql,Orm,Timescaledb,我正在尝试做一些非常类似的事情: 但他们发现解决方案并不充分 使用与前面链接中相同的示例,假设我们有一个Django模型 class Measurement(models.Model): device_id = models.IntegerField(primary_key=True) time = models.DateTimeField() s0 = models.FloatField(blank=True, null=True) s1 = models.F

我正在尝试做一些非常类似的事情:

但他们发现解决方案并不充分

使用与前面链接中相同的示例,假设我们有一个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;
但我们看到,运行如下查询:

qs = (
    Measurement.objects
    .filter(...)
    .annotate(tb=TimeBucket('time'))
    .values('tb')
    .annotate(s_desc=Avg('s0'))
    .order_by('tb')
)
并检查其对应的
qs。查询
将始终在分组中包含
时间
。我只想按原始SQL中显示的派生值tb进行分组。从我所读的内容来看,您只需要使用
值('tb')
,正如我们在上面所做的那样,按
tb
分组,但出于某种原因,Django似乎附加了
时间。为什么会这样


是否可能我的问题与此外部函数有关,而与我试图按计算字段分组有关?

尝试删除第二个注释,并检查其是否仍按时间分组。我觉得这是由平均值引起的。但不确定。该字段没有按时间分组的
,但无法达到目的,因为我想使用此计算字段计算其他注释。甚至直接从Timescale DB的文档中也可以看到如下内容:``选择时间段('5分钟',时间)作为5分钟,平均cpu(cpu)从度量组按5分钟顺序按5分钟描述限制10;```变为:```metrics.objects.values(five_min=time_bucket(time,“5分钟”))。注释(avg_cpu=avg(“cpu”))选择time_bucket('5分钟',time)作为five_min,avg(cpu)作为avg_cpu从metrics组中按时间、时间(time_bucket('5分钟',time))```我真傻!我的模型中有一个默认的顺序!它导致它按有序字段添加一个组。非常感谢。尝试删除第二个注释,并检查其是否仍具有“按时间分组”。我觉得这是由平均值引起的。但不确定。该字段没有按时间分组的
,但无法达到目的,因为我想使用此计算字段计算其他注释。甚至直接从Timescale DB的文档中也可以看到如下内容:``选择时间段('5分钟',时间)作为5分钟,平均cpu(cpu)从度量组按5分钟顺序按5分钟描述限制10;```变为:```metrics.objects.values(five_min=time_bucket(time,“5分钟”))。注释(avg_cpu=avg(“cpu”))选择time_bucket('5分钟',time)作为five_min,avg(cpu)作为avg_cpu从metrics组中按时间、时间(time_bucket('5分钟',time))```我真傻!我的模型中有一个默认的顺序!它导致它按有序字段添加一个组。非常感谢。
qs = (
    Measurement.objects
    .filter(...)
    .annotate(tb=TimeBucket('time'))
    .values('tb')
    .annotate(s_desc=Avg('s0'))
    .order_by('tb')
)