2013-08-13 12 views
8

muszę zrobić następujące kwerendy w Django:Jak pomnożyć i suma dwóch kolumn z grupy przez w django

SELECT sum(T.width * T.height) as amount 
FROM triangle T 
WHERE T.type = 'normal' 
GROUP BY S.color 

Jak mogę to zrobić za pomocą django ORM? Próbowałem to:

Triangle.objects.filter(type='normal').\ 
       extra(select={'total':'width*height'}).\ 
       values('id', 'total').\ 
       annotate(amount=Sum('total')) 

ale to nie działa, błąd pojawia się to, że nie jest RAZEM w modelu. Jak mogę to naprawić?

Odpowiedz

11

Oto co można zrobić:

Triangle.objects.filter(type="normal").values('color').annotate(amount=Sum('id', field="width * height") 

To będzie produkować następujące zapytanie (I zostały uproszczone dla czytelności):

SELECT color, sum(width * height) as amount 
FROM triangle 
WHERE type = 'normal' 
GROUP BY color 

Uwaga: Mam założyć color jest dziedziną Triangle model jako inne pola.

+0

Dziękuję bardzo przyjacielu, twoje rozwiązanie bardzo mi pomogło. – rodrixd

+0

Czy to jest nieudokumentowana funkcja ...? Nie widzę go nigdzie na stronie agregacji Django docs. https://docs.djangoproject.com/en/1.8/topics/db/aggregation/ – tufelkinder

+0

@tufelkinder to czas, w którym użyłem django, a odpowiedź została opublikowana dawno temu. Po szybkim przyjrzeniu się dokumentom nie widzę, żeby słowo kluczowe 'field' zostało udokumentowane. Dobry połów, byłby zadowolony, gdyby można było znaleźć odniesienie do dokumentacji. Dzięki! – alecxe