使用Django ORM注释查询计算2表值之和

2024-10-05 10:07:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张桌子

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有多个{}。这里我要计算单个BillingSum(costOfTest - concession)。在

我可以用一个查询来实现这一点吗?在

需要帮助,谢谢。在


Tags: keyidtruedefaultmodelmodelsclassbilling
1条回答
网友
1楼 · 发布于 2024-10-05 10:07:36

你可以这样写:

from django.db.models import F, Sum

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

在这里,这个QuerySet中的每个Billing对象都有一个额外的属性.the_sum,它是所有costOfTest减去所有与之相关的BillingInfo对象的concession之和。在

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

^{pr2}$

因此,当您“具体化”查询时,查询将在单个调用中获得所有对象的总和。在

对于没有任何相关的Billing对象,the_sum属性将是None,我们可以通过使用^{} [Django-doc]函数来避免:

from django.db.models import F, Sum, Value
from django.db.models.functions import Coalesce

Billing.objects.annotate(
    the_sum=Coalesce(
        Sum(F('billinfo__costOfTest') - F('billinfo__concession')),
        Value(0)
    )
)

相关问题 更多 >

    热门问题