Django ORM GROUP BY - PullRequest
       24

Django ORM GROUP BY

3 голосов
/ 06 августа 2009

Этот запрос PostgreSQL решает мою проблему, но я не уверен, как поместить его в Django ORM.

SELECT DISTINCT ON (to_email) * FROM (SELECT * FROM invitation_invitation ORDER BY date_invited DESC) AS sub

Из списка элементов мне нужны все отдельные строки для столбца "to_email", а там, где to_email является дубликатом, следует выбрать самый последний (date_invited)

Ответы [ 2 ]

3 голосов
/ 06 августа 2009

Вот обзор о выполнении агрегирования в Django ORM и, в частности, о функциональности values.

UPDATE: Чтобы привести его в действие, что-то похожее на

Invitation.objects.values('to_email').annotate(date_invited=Max('date_invited'))

должно работать для вашего примера.

ОБНОВЛЕНИЕ 2: Ферран прав, что он будет получать только поле to_email и аннотацию date_invited. Если другая информация необходима сразу же, то, вероятно, проще всего выполнить фильтрацию «только самые последние» в Python. Предлагаемое решение больше подходит для ситуации, когда вы изначально отображаете список только с краткими данными и предоставляете более подробную информацию по запросу (при условии, что сводных данных достаточно для однозначной идентификации записи).

1 голос
/ 06 августа 2009

Я думаю, что вы не можете сделать это с помощью django ORM только с одним запросом. ORM не делает такого рода подзапросы. Вы можете использовать объект соединения и написать SQL самостоятельно или создать подзапрос и получить шаг DISTINCT с кодом Python.

Редактировать

Решение, предложенное Хэнком Гаем, в порядке, но получает только поля date_invited и to_email , и заданный вопрос состоит в том, чтобы получить все поля последней записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...