我有一个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 }}
但是 没有任何表现。
答案 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
,这通常会导致人们遇到问题。