从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/

10-12 01:26
查看更多