Django эквивалент SELECT * GROUP BY в MySQL - PullRequest
0 голосов
/ 25 января 2020

У меня проблемы с использованием .annotate() и .aggregate() в Django ORM.

Структура моей таблицы:

-----------------------------------------------------
| id    group_id               date_time            |
| ================================================= |
| 1        1             2020-01-25 19:51:46.603859 |
| 2        2             2020-01-24 18:40:24.301419 |
| 3        1             2020-01-25 20:14:11.123860 |
| 4        2             2020-01-25 05:20:21.507901 |
-----------------------------------------------------


// Отредактировано

У меня есть следующий MySQL Запрос:

SELECT m.*
FROM my_table m 
  JOIN (
   SELECT group_id, max(date_time) as max_date
   FROM my_table
   GROUP BY group_id
  ) as s on m.group_id=s.group_id and m.date_time=s.max_date 

, который возвращает:

-----------------------------------------------------
| id    group_id               date_time            |
| ================================================= |
| 3        1             2020-01-25 19:51:46.603859 |
| 4        2             2020-01-24 18:40:24.301419 |
-----------------------------------------------------

И я пытаюсь преобразовать его в Django ORM, чтобы я мог получить полный QuerySet объектов. До сих пор я использовал этот код:

unique_qs = MyModel.objects.filter(id__lte=50).values_list('group_id', flat=True).distinct()
unique_obj = []
for qs in unique_qs: 
    unique_obj.append(MyModel.objects.filter(group_id = qs).latest('date_time'))

Но он действительно неэффективен и отнимает много времени. Не могли бы вы дать мне понять, как этого добиться?

1 Ответ

1 голос
/ 25 января 2020

сначала импортируйте функцию Max, как вы можете видеть ниже:

from django.db.models import Max

, а затем, это то, что вам нужно:

MyModel.objects.filter(id__lte=50).values('group_id').order_by('group_id').annotate(date_time_max=Max('date_time'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...