使用Django ORM注释查询以计算2个表值的总和

时间:2018-10-22 13:26:30

标签: python mysql django django-models django-rest-framework

我有2张桌子

Class Billing(models.Model):
 id=models.AutoField(primary_key=True)
 .....
 #Some more fields
 ....


Class BillInfo(models.Model):
  id=models.AutoField(primary_key=True)
  billing=models.ForeignKey(Billing)
  testId=models.ForeignKey(AllTests)
  costOfTest=models.IntegerField(default=0)
  concession=models.IntegerField(default=0)

这里BillInfo是顶点表,即一个Billing具有多个BillInfo。在这里,我想为单个Sum(costOfTest - concession)计算Billing

我可以使用单个查询来实现吗?

需要帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

您可以这样写:

from django.db.models import F, Sum

Billing.objects.annotate(
    the_sum=Sum(F('billinfo__costOfTest') - F('billinfo__concession'))
)

Billing中的每个QuerySet对象将具有一个额外的属性.the_sum,它是所有costOfTest的总和减去所有<concession的< em>相关 BillingInfo个对象。

计算此值的SQL查询将大致如下:

SELECT billing.*
       SUM(billinginfo.costOfTest - billinginfo.concession) AS the_sum
FROM billing
LEFT OUTER JOIN billinginfo ON billinginfo.billing_id = billing.id
GROUP BY billing.id

因此,当您“实现”查询时,该查询将在一次调用中获得Billing对象的 all 个对象的总和。

对于没有任何相关Billing的{​​{1}}对象,BillingInfo属性将为the_sum,我们可以通过使用Coalesce [Django-doc]函数来避免这种情况:

None