Django - 显示记录表的总和

时间:2011-09-18 17:32:57

标签: django django-templates

我有一张表,其中有发票清单及其详细信息:

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,添加与当前发票匹配的所有订单项。然而,这似乎非常低效。

关于如何做到这一点的更好的想法?

谢谢!

2 个答案:

答案 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“_”的串联,而不是相关模型中字段的名称。