Создание списков / отчетов с встроенными резюме в Django - PullRequest
6 голосов
/ 13 февраля 2009

Я пытаюсь написать представление, которое сгенерирует отчет, который отобразит все элементы в моей системе инвентаризации и предоставит сводные данные в определенный момент. Кстати, этот отчет является просто HTML-шаблоном.

В моем случае каждый пункт является частью заказа. В Ордере может быть несколько позиций, и я хочу иметь возможность отображать итоговые суммы на основе СУММ после окончания каждого заказа.

Итак, отчет выглядит примерно так:

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

Теперь я вполне способен отображать все значения и уже имею отчет, показывающий все элементы, но я понятия не имею, как я могу разместить промежуточные итоги в отчете, не выполняя много из запросы. Поля «Количество», «Количество продано» и «Стоимость» являются лишь частью модели «Товар», а «Значение стоимости» - это просто простая функция модели.

Любая помощь будет оценена. Заранее спасибо: -)

Ответы [ 3 ]

3 голосов
/ 13 февраля 2009

Промежуточные итоги - это 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 голос
/ 13 февраля 2009

Предполагая, что вы не собираетесь использовать какие-либо поля, относящиеся к порядку, вы можете выполнить один запрос к БД с последующими вычислениями на 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 в обоих запросах. Вы также можете использовать любую функцию агрегирования, не только те, которые доступны на стороне БД.

1 голос
/ 13 февраля 2009

Вы можете вычислить промежуточные итоги в Python в представлении Django.

Промежуточные итоги могут храниться в экземплярах объекта Model с атрибутом, указывающим, что это промежуточный итог. Для простоты шаблона отчета можно вставить объекты промежуточного итога в нужных местах в списке результатов и использовать атрибут промежуточного итога, чтобы по-разному отображать строки промежуточного итога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...