2009-02-13 64 views
5

我正在嘗試編寫一個視圖,該視圖將生成一個報告,顯示我的庫存系統中的所有項目,並在某個點提供摘要。順便提一下,這份報告純粹只是一個HTML模板。在Django中使用內嵌摘要生成列表/報告

就我而言,每個項目都是訂單的一部分。一個訂單可以有幾個項目,我希望能夠在每個訂單結束後顯示基於彙總。

所以報告那種看起來是這樣的:

Order #25  <Qty> <Qty Sold> <Cost> <Cost Value> 
Some Item   2  1  29.99 29.99 
Another Item  4  0  10.00 40.00 
<Subtotal Line> 6  1  39.99 69.99 
Order #26  <Qty> <Qty Sold> <Cost> <Cost Value> 
... Etc, you get the point 

現在,我完全能夠顯示所有的值和已經顯示所有的商品的報告,但我不知道我怎麼能將小計放置在報告中,而不用做很多的查詢。 Quantity,Qty Sold和Cost字段只是Item模型的一部分,Cost Value只是一個簡單的模型函數。

任何幫助,將不勝感激。在此先感謝:-)

回答

3

小計是SELECT SUM(qty) GROUP BY order_number東西。

它們完全獨立於查詢以獲取詳細信息。

這兩個查詢的結果需要交織。做到這一點的一個好方法是將每個訂單創建爲一個元組(list_of_details, appropriate summary)

然後

{% for order in orderList %} 
    {% for line in order.0 %} 
     {{ line }} 
    {% endfor %} 
    {{ order.1 }} 
{% endfor %} 

困難的部分是交錯的兩個查詢的顯示是容易的。

details = Line.objects.all() 
ddict = defaultdict(list) 
for d in details: 
    ddict[d.order_number].append(d) 

interleaved= [] 
subtotals = ... Django query to get subtotals ... 
for s in subtotals: 
    interleaved.append((ddict[s.order], s.totals)) 

interleaved對象可以給您的模板進行渲染。

from itertools import groupby 
items = OrderItem.objects.select_related('order').order_by('order').all() # order_by is essential 
items_by_order = dict(groupby(items, lambda x: x.order)) 
for order, items in items_by_order: 
    items_by_order[order]['subtotals'] = ... # calculate subtotals for all needed fields 

這是更通用的方法相比,使用separeate SQL查詢來計算:

1

您可以在Django視圖中計算Python中的小計。

小計可以存儲在Model對象的實例中,並帶有一個屬性指示它是小計。爲了簡化報告模板,您可以將小計全部對象插入結果列表中的正確位置,並使用小計屬性以不同的方式顯示小計。

+0

所以你基本上是通過Python創建`report` queryset循環的,當它識別出我處於一個新的順序時,我總結了那組項值,然後在列表在正確的點?我希望這是有道理的,這是我現在最好的想法。 – Bartek 2009-02-13 15:50:58

+0

概念上,是的。實際的實現可以避免使用小計字典或其他實現來檢測新訂單。 – 2009-02-13 15:57:25

1

假設你不打算使用任何特定的順序字段,你可以進行單DB查詢其次是一些蟒蛇計算小計在兩個查詢中強制同步WHERE子句的責任。你也可以使用任何agregate函數,而不僅僅是DB端可用的。