2016-04-23 40 views
0

我有一个将外键传递给其子表的主表。我想要显示来自主表的所有项目的列表以及来自子表格的列的总和。Django:具有由主表传递的唯一密钥的子表列的总和

如何在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 }}但 说明不了什么。

+0

您需要显示更多详细信息。模型是什么样子的?到目前为止,你有什么? –

+0

@DanielRoseman更新了问题。 –

回答

0

在django中注释和聚合可能会有点t。。尝试打开manage.py shell并使用您的查询集serviceinvoice.objects.all().annotate(sum_list=Sum(...)并查看其中的一些结果,以验证它是否回馈您期望的结果。这样可以排除模板和视图的所有可能问题,而不会达到您期望的效果。

如果这是给奇怪的结果,看看https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values 把一个.values()的注释改变GROUP BY之前的ORM产生,这通常是人们问题的原因。

相关问题