在Django中使用PostgreSQL聚合表达式

时间:2018-08-27 14:34:46

标签: django postgresql django-rest-framework

从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完全有可能吗?还是需要做其他事情(原始查询,子查询等)来实现相同的结果?

1 个答案:

答案 0 :(得分:0)

我想您可以尝试以下方法:

queryset = queryset \
    .annotate(line=Func('position', Value('ORDER BY timestamp'), function='ST_MakeLine', arg_joiner=' ')) \
    .values('line')

并且此QuerySet应该生成正确的SQL查询。

您还可以通过继承Func来实现自己的函数类。