我正试图做一些非常类似的事情。为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
不知为何。为什么会出现这种情况呢?
是不是我的问题不在于这个外部函数,而在于我想通过计算字段来分组?