7

我正在尝试编写一个视图,该视图将生成一个报告,该报告显示我的库存系统中的所有项目,并在某个点提供摘要。顺便说一下,这份报告纯粹只是一个 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

现在,我完全有能力显示所有值,并且已经有一个显示所有项目的报告,但我不知道如何在不进行大量查询的情况下将小计放在报告中。Quantity、Qty Sold 和 Cost 字段只是 Item 模型的一部分,Cost Value 只是一个简单的模型函数。

任何帮助,将不胜感激。提前致谢 :-)

4

3 回答 3

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对象提供给您的模板进行渲染。

于 2009-02-13T15:49:36.393 回答
1

您可以在 Django 视图中计算 Python 中的小计。

小计可以存储在 Model 对象的实例中,其属性表明它是小计。为了保持报表模板简单,您可以在结果列表中的正确位置插入小计对象,并使用小计属性以不同方式呈现小计行。

于 2009-02-13T15:48:08.707 回答
1

假设您不打算使用任何特定于订单的字段,您可以执行单个 DB 查询,然后执行一些 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

与使用单独的 SQL 查询来计算小计相比,这是一种更通用的方法,小计会在两个查询上强加同步 WHERE 子句的责任。您还可以使用任何 agregate 函数,而不仅仅是那些在 DB 端可用的函数。

于 2009-02-13T16:39:06.713 回答