我正在尝试编写一个视图,该视图将生成一个报告,显示我的库存系统中的所有项目,并在某个点提供摘要。顺便说一句,这份报告纯粹只是一个HTML模板。
在我的情况下,每个项目都是订单的一部分。订单可以有多个项目,我希望能够在每个订单结束后显示基于SUM的摘要。
所以报告看起来像这样:
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
现在,我完全有能力显示所有值,并且已经有一个显示所有项目的报告,但我不知道如何在不执行很多的情况下将Subtotals放在报告中查询。 Quantity,Qty Sold和Cost字段只是Item模型的一部分,Cost Value只是一个简单的模型函数。
任何帮助将不胜感激。在此先感谢: - )
答案 0 :(得分: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
对象提供给模板进行渲染。
答案 1 :(得分:1)
您可以在Django视图中计算Python中的小计。
小计可以存储在Model对象的实例中,其属性指示它是小计。为了简化报告模板,您可以将子总计对象插入结果列表中的正确位置,并使用sub-total属性以不同方式呈现子总计行。
答案 2 :(得分:1)
假设您不打算使用任何特定于订单的字段,您可以执行单个数据库查询,然后进行一些python计算:
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查询计算小计相比,这是更通用的方法,小计在两个查询中强制要求同步WHERE子句。您还可以使用任何agregate功能,而不仅仅是DB端可用的功能。