Django ORM-запрос GROUP BY несколькими столбцами, объединенными MAX

Я использую Django с MySQL. У меня есть модель, подобная следующей:

class MM(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()
    c = models.DateTimeField(auto_now_add=True)

У меня есть несколько строк, которые a равны b, и я хочу выполнить следующий SQL-запрос:

SELECT a, b, MAX(c) AS max FROM MM GROUP BY b, a;

Как это можно сделать с Django ORM? Я пробовал разные подходы, используя аннотации, но теперь удача пока.

Спасибо большое!

Ответ 1

Я думаю, вы можете сделать что-то вроде:

MM.objects.all().values('b', 'a').annotate(max=Max('c'))

Обратите внимание, что вам нужно импортировать что-то, чтобы использовать Max: from django.db.models import Max

values('b', 'a') даст GROUP BY b, a, а annotate(...) вычислит MAX в вашем запросе.

Ответ 2

Вы также можете попробовать это.

from django.db.models import Max

mm_list=MM.objects.all().values('b','a').annotate(max=Max('c'))
for mm in mm_list:
    a=mm['a']
    b=mm['b']
    max=mm['max']

Ответ 3

Суммируйте группу полей по двум полям.

from django.db.models import Sum

SQL

select caja_tipo_id, tipo_movimiento, sum(monto) from config_caja group by caja_tipo_id, tipo_movimiento

Django

objs = Caja.objects.values('caja_tipo__nombre','tipo_movimiento').order_by().annotate(total=Sum('monto'))