Использование агрегатных выражений PostgreSQL в Django - PullRequest
0 голосов
/ 27 августа 2018

Начиная с PostgreSQL 9.0+, поддерживается использование агрегатных выражений . Например, вы можете использовать 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 или мне придется что-то еще делать (необработанный запрос, подзапрос и т. Д.) Для достижения того же результата?

1 Ответ

0 голосов
/ 27 августа 2018

Полагаю, вы можете попробовать следующее:

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

И этот QuerySet должен генерировать правильный SQL-запрос.

Также вы можете реализовать свой собственный класс функций, наследуя от Func.

...