2013-04-02 14 views
10

Używam Django z MySQL. Mam model podobny do następującego:Grupa zapytań ORM Django WEDŁUG wielu kolumn połączonych przez MAX

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

mam wiele wierszy, które a jest równa b, i chcę wykonać następujące zapytanie SQL:

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

Jak można to zrobić z Django ORM? Próbowałem różnych podejść za pomocą adnotacji, ale do tej pory szczęście.

Wielkie dzięki!

Odpowiedz

9

myślę, że można zrobić coś takiego:

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

Należy pamiętać, że trzeba importować coś używać Max: from django.db.models import Max

values('b', 'a') dadzą GROUP BY b, a i annotate(...) będzie obliczyć max w zapytaniu.

+3

FYI Opcja 'wszystko()' jest zbędne i nie jest wymagane. – mynameistechno

0

Suma grupy pól według dwóch pól.

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

Można spróbować również

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