2016-07-20 3 views
1

ich ein Modell haben, wie folgt:Berechnen Sie die Differenz von 2 aggregiert Summe in einer Abfrage

class Loan(models.Model): 
    lender = models.ForeignKey(User, related_name='lender') 
    borrower = models.ForeignKey(User, related_name='borrower') 
    money = models.IntegerField() 

Was ich tun möchte, ist das Bruttogesamt für einen Benutzer zu berechnen:

gross_total = Loans.object.filter(lender=user).annonate(Sum('money')) 
       - Loans.object.filter(borrower=user).annonate(Sum('money')) 

Mein aktueller Die Gesamtberechnung verwendet zwei Abfragen. Ich hätte gerne eine einzige Abfrage dafür.

Danke.

Antwort

2

Dies kann miterfolgen

from django.db.models import Case, Value, When, IntegerField 

gross_total = Loans.object.aggregate(
    gross=Sum(
     Case(
      When(lender=user, then=F('money')), 
      default=0, output_field=IntegerField) 
     ) 
    ) - Sum(
     Case(
      When(borrower=user, then=F('money')), 
      default=0, output_field=IntegerField) 
     ) 
    ) 
) 
+0

Das ist genau das, was ich brauche, wusste nicht einmal, dass wir das im Django machen können. Vielen Dank!! :) – s0nskar

0

Zuerst wird, wie Sie mit Hilfe von zwei Fremdschlüssel aus dem gleichen User-Modell, müssen Sie sie ein ‚related_name‘ wie folgt erhalten:

class Loan(models.Model): 
    lender = models.ForeignKey(User, related_name='lender') 
    borrower = models.ForeignKey(User, related_name='borrower') 
    money = models.IntegerField() 

Jetzt kommen auf Ihre Frage, was Sie brauchen, ist etwas gegeben in diesem Beitrag ->How to group by AND aggregate with Django

So ist die gewünschte Abfrage für Ihre Frage wird höchstwahrscheinlich sein:

gross_total = Loans.objects.filter(lender=user).values('user').annotate(score = Sum('money')) - Loans.objects.filter(borrower=user).values('user').annotate(score = Sum('money')) 
+0

das ist nicht was will, ich habe die Frage bearbeitet. BTW Danke für das 'Wert ('Benutzer')' Ding wusste nicht darüber – s0nskar

+1

Kein Problem. Wenn Sie eine einzige Abfrage wünschen, dann brauchen Sie wahrscheinlich einen F() Ausdruck. Sehen Sie dies -> https://docs.djangoproject.com/de/1.9/ref/models/expressions/ Ich versuche, die erforderliche Antwort auf Ihre aktualisierte Frage zu finden. Wenn ich will, füge ich noch eine Antwort hinzu. –

Verwandte Themen