从PostgreSQL 9.0+开始,支持使用aggregate expressions。例如,您可以使用ORDER BY
在调用PostGIS函数ST_MakeLine
之前对行进行排序,如下所示:
SELECT ST_MakeLine(position ORDER BY timestamp)::bytea AS line
FROM recorded_positions
WHERE dataset_id = 98
我在我的应用程序中所做的是以下尝试,但显然这不是
order_by()
的用例:queryset = queryset.order_by('timestamp') \
.annotate(line=Func('position', function='ST_MakeLine')) \
.values('line')
当然,这会为我想要的内容生成以下错误的SQL(并且由于在非聚合列上使用
order_by
而无效):SELECT ST_MakeLine(position)::bytea AS line
FROM recorded_positions
WHERE dataset_id = 98
ORDER BY timestamp ASC
对于Django,这是可能的吗?还是我必须做其他事情(原始查询、子查询等)来完成相同的结果?
最佳答案
我想你可以试一下:
queryset = queryset \
.annotate(line=Func('position', Value('ORDER BY timestamp'), function='ST_MakeLine', arg_joiner=' ')) \
.values('line')
这个QuerySet应该生成正确的SQL查询。
也可以通过继承
Func
来实现自己的函数类。关于django - 在Django中使用PostgreSQL聚合表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52041630/