我有一张表,其中有发票清单及其详细信息:
class Invoice(models.Model):
invoiceNum = models.CharField(etc...)
invoiceDate = models.DateField(etc...)
customerID = models.ForeignKey(etc...)
isPaid = models.CharField(etc...)
Invoice
记录不包含实际发票总额。相反,发票的总数由多个Invoice_Line_Item
记录组成,保存在另一个表中:
class Invoice_Line_Item(models.Model):
invNum = models.ForeignKey(Invoice)
itemName = models.CharField(etc...)
itemPrice = models.DecimalField(etc...)
我有一个网络应用程序,可以显示大型HTML表格中的所有发票,以及表格tr
行中该发票的所有详细信息。发票日期,发票编号,客户ID等详细信息均来自Invoice
表。此HTML
table
会显示数百张发票。
我想要做的还是显示每张发票的总价值 - 这是所有订单项的总和。但是,由于发票明细和构成发票总额的订单项位于两个不同的表中,因此我无法想出一种简单的方法来实现这一点。
我认为的一种方法是将整个Invoice_Line_Item
querySet传递到HTML模板,然后对于表tr
中显示的每个发票,我可以迭代整个Invoice_Line_Item
querySet,添加与当前发票匹配的所有订单项。然而,这似乎非常低效。
关于如何做到这一点的更好的想法?
谢谢!
答案 0 :(得分:4)
一个词:聚合
Invoice_Line_Item.objects.filter(invNum=invoice).aggregate(Sum('itemPrice'))
https://docs.djangoproject.com/en/dev/topics/db/aggregation/
另一种方法是将总数存储在Invoice中,并在您更改相关Invoice_Line_Item
时更新它
答案 1 :(得分:0)
还有一个词:注释。
from django.models import Sum
Invoice.objects.filter( .. ).annotate( InvTotal=Sum( 'invoice_line_number__itemPrice' ) )
InvTolal成为Invoice对象的新属性,您可以在模板中使用它与invoiceNum或invoiceDate一样。
使用这种方法,您不必将任何其他数据结构传递给模板,只需传递发票的查询集。
请注意: Sum的参数是一个字符串,它是转换为小写的相关模型名称的串联,而不是double“_”的串联,而不是相关模型中字段的名称。