2009-02-13 13 views
5

Estoy intentando escribir una vista que genere un informe que muestre todos los elementos dentro de mi sistema de inventario y proporcione resúmenes en un cierto punto. Por cierto, este informe es simplemente una plantilla HTML.Generación de listas/informes con resúmenes en línea en Django

En mi caso, cada artículo es parte de un pedido. Una orden puede tener varios elementos, y quiero poder mostrar resúmenes basados ​​en SUM una vez finalizado cada pedido.

Así el informe tipo de parece a esto:

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 

Ahora, soy perfectamente capaz de mostrar todos los valores y ya tienen un informe que muestra todos los artículos, pero no tengo ni idea de lo que pueda coloque subtotales dentro del informe de esa manera sin hacer mucho de consultas. Los campos Cantidad, Cantidad vendida y Costo son solo parte del modelo de Artículo, y el Valor de costo es solo una función de modelo simple.

Cualquier ayuda sería apreciada. Gracias de antemano :-)

Respuesta

3

Subtotales son SELECT SUM(qty) GROUP BY order_number cosas.

Están completamente separados de una consulta para obtener más detalles.

Los resultados de las dos consultas deben intercalarse. Una buena forma de hacerlo es crear cada orden como una tupla (list_of_details, appropriate summary).

caso, la pantalla es fácil

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

La parte difícil es entrelazado de las dos consultas.

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)) 

Este objeto interleaved se puede dar a su plantilla para la representación.

+0

¡Muchas gracias! Después de jugar un poco con el Django ORM para obtener la funcionalidad correcta de GROUP BY, casi lo tengo funcionando. Gracias de nuevo – Bartek

1

Puede calcular los subtotales en Python en la vista de Django.

Los subtotales se podrían almacenar en instancias del objeto Modelo con un atributo que indique que se trata de un subtotal. Para mantener la plantilla de informe simple, puede insertar los objetos subtotales en los lugares correctos en la lista de resultados y usar el atributo de subtotal para representar las líneas de subtotales de manera diferente.

+0

Así que está diciendo básicamente recorrer el queryset creado 'report' a través de Python, y cuando reconoce que estoy en un nuevo orden, resumí los valores de ese grupo de elementos, luego inyecté el atributo de subtotal dentro del lista en el punto correcto? Espero que tenga sentido, es mi mejor idea a partir de ahora. – Bartek

+0

Conceptualmente, sí. La implementación real podría evitar tener que detectar un nuevo orden utilizando un diccionario de subtotal o alguna otra implementación. –

1

Suponiendo que no va a utilizar cualquiera de los campos específicos del pedido, puede realizar consulta DB sola seguida de algunos cálculos pitón:

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 

Esto se enfoque más genérico en comparación con el uso de consulta SQL para calcular separeate subtotales que imponen la responsabilidad de sincronizar las cláusulas WHERE en ambas consultas. También puede usar cualquier función agregada, no solo la disponible en el lado DB.

Cuestiones relacionadas