2016-07-20 3 views
1

У меня есть модель выглядит следующим образом:Вычислить разность 2 агрегированного Сумма в одном запросе

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

То, что я хочу сделать, это рассчитать валовой общей для пользователя:

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

Мой текущий общий расчет использует два запроса. Мне нужен один запрос для этого.

Спасибо.

ответ

2

Это может быть сделано с conditional expressions

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

Это именно то, что мне нужно, даже не знало, что мы можем это сделать в джанго. Благодаря!! :) – s0nskar

0

Во-первых, как вы используете два внешних ключей из одной и той же модели пользователя, вы должны дать им «related_name», как это:

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

Теперь приходя на ваш вопрос, что вам нужно что-то дано в этом посте ->How to group by AND aggregate with Django

Таким образом, требуемый запрос на ваш вопрос, скорее всего, будет:

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

Это не то, что нужно, я отредактировал вопрос. btw спасибо за это 'значение ('пользователь')' вещь не знала об этом – s0nskar

+1

Не проблема. Если вам нужен один запрос, то я полагаю, вам нужно выражение F(). См. Это -> https://docs.djangoproject.com/en/1.9/ref/models/expressions/ Я пытаюсь найти ответ на ваш обновленный вопрос. Если я захочу, я добавлю еще один ответ. –

Смежные вопросы