2011-09-18 54 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的參數是一個字符串,它是將相關模型名稱轉換爲小寫字母,比雙「_」,以及相關模型中的字段名稱的串聯。