Django:如何获得与单行相关的所有行的SUM

时间:2016-12-27 04:43:59

标签: django django-models django-templates django-views

我有2个型号。 serviceinvoice和invoiceitems。 invoiceitems模型使用外键链接到serviceinvoice。

现在,对于单一发票,我如何获得总折扣金额。 Annotate不起作用,因为它仅适用于单行。 的 Models.py

class serviceinvoice(models.Model):
    user=models.ForeignKey(settings.AUTH_USER_MODEL,related_name='invoice')    
    invoice_number=models.CharField(max_length=100)
    invoice_date = models.DateField()


class serviceinvoiceitems(models.Model):
    user=models.ForeignKey(settings.AUTH_USER_MODEL,related_name='serviceinvoiceitem')
    company=models.ForeignKey(Organisation,related_name='sitemcomp')
    invoice_number=models.ForeignKey(serviceinvoice,related_name='serviceitems1')
    discount = models.BooleanField(default=False)
    discount_amount = models.FloatField(null=True,blank=True,default=0)
    Amount=models.FloatField()
    discription=models.CharField(max_length=500,blank=True,null=True)

我正在努力寻找:

invoice_detailmain = serviceinvoice.objects.get(pk=pk)
dis_value_total = Sum('invoice_detailmain__serviceitems1__discount_amount')

它没有给出discount_amount的总和。 什么是解决方案以及如何在模板中显示它?

1 个答案:

答案 0 :(得分:2)

使用反向关系:

IO.inspect

请注意,这是使用django ORM中的内置invoice_detailmain = serviceinvoice.objects.get(pk=pk) dis_value_total = sum(i.discount_amount for i in invoice_detailmain.serviceinvoiceitems_set.all()) 而不是sum

另一种方法是注释整个查询集,然后获取您的个人发票:

Sum

这是有效的,因为i = serviceinvoice.objects.annotate(Sum('serviceinvoiceitems__discount_amount')).get(pk=pk) 将返回另一个查询集,因此您可以将操作链接在一起。