Python 将SQL函数注释为Django ORM Queryset`FUNC`/`AGGREGATE`
我正在尝试做一些非常类似的事情: 但他们发现解决方案并不充分 使用与前面链接中相同的示例,假设我们有一个Django模型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
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')
)