我有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
。
我可以使用单个查询来实现吗?
需要帮助,谢谢。
答案 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