Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用Django ORM注释查询计算2个表值之和_Python_Mysql_Django_Django Models_Django Rest Framework - Fatal编程技术网

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

Python 用Django ORM注释查询计算2个表值之和,python,mysql,django,django-models,django-rest-framework,Python,Mysql,Django,Django Models,Django Rest Framework,我有两张桌子 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(AllTest

我有两张桌子

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是垂直表,即一个账单有多个BillInfo。在这里,我想计算单一账单的SumcostOfTest优惠

我可以使用单个查询来实现这一点吗

需要帮助,请提前感谢。

您可以这样写:

from django.db.models import F, Sum

Billing.objects.annotate(
    the_sum=Sum(F('billinfo__costOfTest') - F('billinfo__concession'))
)
这里,此查询集中的每个计费对象都有一个额外属性。_sum是所有costOfTests的总和减去所有相关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
因此,当您具体化查询时,查询将在一次调用中获得所有计费对象的总和

对于没有任何相关BillingInfo的计费对象,_sum属性将为None,我们可以通过使用函数来避免:

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)
    )
)

从BillInfo到Billing的外键是什么?是的,问题已更新。BillingInfo将Billing作为外键。获取错误django.core.exceptions.FieldError:无法将关键字“billinfo”解析到字段中。@GAJESHPANIGRAHI:事实上,正如您在查询中所看到的,我们在联接中使用此外键的billing_id对应项。@GAJESHPANIGRAHI:关键是,如果您定义了从模型a到B的外键,Django构造了一个从B到A的隐式关系。但是我想从Billing模型访问BillInfo,Billing是BillInfo的外键。有一个对象billinginfo\u集。@GAJESHPANIGRAHI:我们正在从billinginfo访问billinginfo。请注意F'billinginfo_u___;…'。ForeignKey位于其他位置这一事实并不重要,因为数据库会进行连接,并且通常会有一个适当的索引来正确地进行连接。这并不是因为数据库中没有存储明确的ForeignKey,而是获取相关BillingInfo集的问题。