Django:具有由主表传递的唯一键的子表的列的总和

时间:2016-04-23 13:33:12

标签: django django-views

我有一个Main表,它将外键传递给它的子表。我想显示主表中所有项目的列表,其中列的总和来自子表。

如何在Django queryset中执行此操作?请帮忙。

Models.py

class serviceinvoice(models.Model):
    user=models.ForeignKey(settings.AUTH_USER_MODEL,related_name='invoice')    
    invoice_number=models.PositiveIntegerField()
    #invoice_no = models.CharField(max_length = 500, default = increment_invoice_number, null = True, blank = True)
    invoice_date = models.DateField()
    invoice_receivable=models.ForeignKey(Receivables,null=True)
    #total_amount=models.DecimalField(decimal_places=2,max_digits=20)
    #total_amountwithtax=models.FloatField()
    company_det=models.ForeignKey(Company,related_name='companydetails')


    class Meta:
        unique_together = (("user", "invoice_number"),)
        ordering=('-invoice_number',) 

    def __str__(self):
        return self.invoice_number

    def get_absolute_url(self):
        return reverse('invoice:editinvoice', args=[self.invoice_number])

class serviceinvoiceitems(models.Model):
    user=models.ForeignKey(settings.AUTH_USER_MODEL,related_name='serviceinvoiceitem')
    invoice_number=models.ForeignKey(serviceinvoice,related_name='serviceitems1')
    Product=models.CharField(max_length=1000)
    UOM=models.CharField(max_length=100)
    Quantity=models.FloatField()
    Rate=models.FloatField()
    Tax_rate=models.FloatField()
    Total_sale=models.FloatField()
    Sales_tax=models.FloatField()
    Total_billamount=models.FloatField()

    def __str__(self):
        return self.invoice_number

views.py

 @login_required
def inv_list(request):
    invoice_list=serviceinvoice.objects.filter(user=request.user)
    totallist=serviceinvoice.objects.annotate(sum_list=Sum('serviceitems1__Total_sale'))
    return render(request,'account/invoicelist.html',{'invoice_list':invoice_list,'totallist':totallist})

到目前为止,我在视图中可以过滤用户的发票清单,但如何从子模型中获取每张发票的总数,即serviceinvoiceitems。

  

试了一下并在模板中传递了{{ totallist.sum_list }}但是   没有任何表现。

1 个答案:

答案 0 :(得分:0)

django中的注释和聚合可能有点抽搐。尝试打开manage.py shell并使用您的查询集serviceinvoice.objects.all().annotate(sum_list=Sum(...),并查看其中的几个结果,以验证它是否会回馈您的期望。这样可以消除模板和视图的所有可能问题,而不是按照预期进行操作。

如果这会产生奇怪的结果,请查看https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values 在注释之前放置.values()会更改ORM生成的GROUP BY,这通常会导致人们遇到问题。