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'))