从PostgreSQL 9.0+开始,支持使用aggregate expressions。例如,在调用PostGIS函数ORDER BY
之前,您可以使用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完全有可能吗?还是需要做其他事情(原始查询,子查询等)来实现相同的结果?
答案 0 :(得分:0)
我想您可以尝试以下方法:
queryset = queryset \
.annotate(line=Func('position', Value('ORDER BY timestamp'), function='ST_MakeLine', arg_joiner=' ')) \
.values('line')
并且此QuerySet应该生成正确的SQL查询。
您还可以通过继承Func
来实现自己的函数类。