gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:52:13 25 4
gpt4 key购买 nike

我有两张 table

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。在这里,我想计算单个 BillingSum(costOfTest - concession)

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

需要帮助,在此先感谢。

最佳答案

你可以这样写:

from django.db.models import F, Sum

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

这里每个Billing此中的对象 QuerySet将有一个额外的属性 .the_sum这是所有 costOfTest 的总和s 减去 concession所有相关 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 的总和单个调用中的对象。

对于 Billing没有任何相关的对象BillingInfo , the_sum属性将为 None ,我们可以通过使用 Coalesce [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)
)
)

关于python - 注释查询以使用 Django ORM 计算 2 个表值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52930555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com