2011-09-18 50 views
3

表的总和我有有发票和他们的详细信息列表的表:Django的 - 显示的记录

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...) 

我有一个web应用程序,显示在一个大的HTML表中的所有发票,与发票上的所有细节一起表的tr行。详细信息如发票日期,发票号码,客户ID等均来自Invoice表。在此HTMLtable中有数百张发票。

我想要做的还是显示每张发票的总价值 - 这是所有订单项的总和。但是,由于发票明细和构成发票总额的订单项位于两个不同的表格中,因此我想不出一个简单的方法来实现此目的。我想

的一种方法是将整个Invoice_Line_Item查询集通入HTML模板,然后在一个表tr显示每张发票,我可以遍历整个Invoice_Line_Item查询集,加起来匹配当前发票的所有行项目。但是,这看起来效率很低。

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

谢谢!

回答

4

一个字:聚合

Invoice_Line_Item.objects.filter(invNum=invoice).aggregate(Sum('itemPrice')) 

https://docs.djangoproject.com/en/dev/topics/db/aggregation/

另一种方式是总存储发票和更新,每次更改相关Invoice_Line_Item

+0

有趣。所以我会创建一个聚集的querySet,并将_that_传递给模板。这样我只会迭代一个比整个'Invoice_Line_Item'查询集小得多的聚合查询集。我有这个权利吗? – Garfonzo

+0

不,聚合返回一个字典,就像{'itemPrice__Sum':100}一样。我认为。你可以使它成为发票的功能,这会使它更漂亮。阅读文档以进行澄清。 – nulvinge

+0

感谢您的提示。我正在阅读文档。我认为这是一个很好的解决方案。 – Garfonzo

0

还有一个词:注释。

from django.models import Sum 

Invoice.objects.filter(..).annotate(InvTotal=Sum('invoice_line_number__itemPrice')) 

InvTolal变得发票对象的新属性,你可以用它在模板的方式invoiceNum或invoiceDate相同。

使用这种方法,您不必将任何其他数据结构传递到您的模板,只需要发票的QuerySet。

请注意: Sum的参数是一个字符串,它是将相关模型名称转换为小写字母,比双“_”,以及相关模型中的字段名称的串联。