#django #group-by #annotate
#django #группировать по #аннотировать
Вопрос:
У меня есть модель, похожая на эту:
class Tree(models.Model):
description = models.CharField(max_length = 255, null = False, blank = False)
parent = models.ForeignKey("Tree", null = True, blank = True, on_delete = models.CASCADE)
class Meta:
ordering = ['description', '-id']
Мне нужно найти последнюю запись для каждого родителя.
Я пытался с этим:
latests = Tree.objects.values("parent").annotate(last = Max("pk"))
Результат неверен, потому что SQL-запрос:
SELECT parent_id, MAX(id) AS last FROM tree GROUP BY id;
ORM переводит внешний ключ в источник и не использует значение внутри поля.
Есть ли способ не «следовать» внешнему ключу и использовать вместо него значение поля?
Модель сгенерировала в базе данных PostgreSQL таблицу с именем tree с тремя столбцами:
Column | Type
------------ -----------------------
id | integer
description | character varying(255)
parent_id | integer
С этими данными:
id | description | parent_id
---- ------------- ----------
1 | A | 1
2 | B | 2
3 | C | 1
4 | D | 1
5 | E | 2
Я хочу этот результат:
last | parent_id
----- ----------
5 | 2
4 | 1
Я могу сделать это просто в SQL с:
select max(id) as last, parent_id from tree group by parent_id
Комментарии:
1. Можете ли вы задокументировать, как должен выглядеть запрос, который вы хотите, в SQL?
2. выберите parent_id, max (идентификатор) из группы дерева по parent_id. Проблема, похоже, такая же, как code.djangoproject.com/ticket/24748 для MySQL. Я использую postgresql
3. Это запрос, который вы получили в соответствии с вашим вопросом, а не запрос, который вы хотите. Пожалуйста, отправьте запрос, который вы хотели бы (т. Е.: запрос ОБЪЕДИНЕНИЯ). Кроме того, ошибка, на которую вы ссылались, была исправлена и отсутствовала в вашем примере, поскольку она правильно группируется по идентификатору.
4. Нет. Это запрос, который я хочу с помощью «GROUP BY parent_id». Запрос, который генерирует система, имеет «ГРУППИРОВАТЬ ПО идентификатору». Я добавил также определение таблицы к вопросу, чтобы быть более понятным.
5. хорошо, пожалуйста, обновите свой вопрос с этими деталями.
Ответ №1:
Наконец, я нашел возможное обходное решение: я удалил порядок в метаклассе, и результат является ожидаемым.