Django — MAX … ГРУППИРОВАТЬ по внешнему ключу для себя

#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:

Наконец, я нашел возможное обходное решение: я удалил порядок в метаклассе, и результат является ожидаемым.