在一个查询中计算2个聚合Sum的差值

时间:2016-07-20 11:25:45

标签: django

我的模型如下:

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 个答案:

答案 0 :(得分: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)
        )
    )
)

答案 1 :(得分:0)

首先,当您使用来自同一用户模型的两个外键时,您需要为它们提供一个相关名称'像这样:

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

现在回答你的问题,你需要的是这篇文章中给出的东西 - > How to group by AND aggregate with Django

因此,您的问题所需的查询很可能是:

$.getJSON(myURL, function(data) {
  state = (parseInt(data.result) == 1)
  $('#phoneyRadio1').attr('checked', !state);
  $('#phoneyRadio2').attr('checked', state);
});