Django

2009-02-13 6 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 

अब, मैं सभी मूल्यों को प्रदर्शित करने में पूरी तरह से सक्षम हूँ और पहले से ही सभी आइटम दिखाने वाली रिपोर्ट है, लेकिन मैं पता नहीं मैं कैसे कर सकते है रिपोर्ट के भीतर Subtotals जगह बिना प्रश्नों के बिना। मात्रा, मात्रा बेचा, और लागत फ़ील्ड आइटम मॉडल का हिस्सा हैं, और लागत मूल्य केवल एक साधारण मॉडल फ़ंक्शन है।

किसी भी मदद की सराहना की जाएगी। अग्रिम धन्यवाद :-)

उत्तर

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 %} 

कठिन भाग दो प्रश्नों interleaving जाता है।

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 वस्तु प्रतिपादन के लिए अपने टेम्पलेट के लिए दिया जा सकता है।

+0

धन्यवाद एक गुच्छा! Django ORM के साथ सही ग्रुप कार्यक्षमता प्राप्त करने के लिए थोड़ा सा खेलने के बाद मैं काफी काम कर रहा हूं। एक बार फिर धन्यवाद – Bartek

1

आप Django व्यू में पायथन में उप-योगों की गणना कर सकते हैं।

उप-योग मॉडल ऑब्जेक्ट के उदाहरणों में एक विशेषता के साथ संग्रहीत किया जा सकता है जो दर्शाता है कि यह उप-कुल है। रिपोर्ट टेम्पलेट को सरल रखने के लिए आप परिणाम सूची में सही जगहों पर उप-कुल ऑब्जेक्ट्स डाल सकते हैं और उप-कुल पंक्तियों को अलग-अलग रूप से प्रस्तुत करने के लिए उप-कुल विशेषता का उपयोग कर सकते हैं।

+0

तो आप पाइथन के माध्यम से बनाई गई 'रिपोर्ट' क्वेरीसेट के माध्यम से मूल रूप से लूप कह रहे हैं, और जब यह पहचानता है कि मैं एक नए क्रम में हूं, तो मैं आइटम मानों के उस समूह को जोड़ता हूं, फिर उप-कुल विशेषता को इंजेक्ट करता हूं सही बिंदु पर सूची? मुझे उम्मीद है कि यह समझ में आता है, यह अब तक का सबसे अच्छा विचार है। – Bartek

+0

संकल्पनात्मक रूप से, हां। वास्तविक कार्यान्वयन उप-योग या कुछ अन्य कार्यान्वयन के शब्दकोश का उपयोग कर एक नए आदेश का पता लगाने से बच सकता है। –

1

मान लिया जाये कि आप किसी भी क्रम-विशिष्ट फ़ील्ड का उपयोग करने के लिए नहीं जा रहे हैं, तो आप एक डीबी क्वेरी कुछ अजगर गणना के बाद प्रदर्शन कर सकता है:

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 क्वेरी उपयोग की तुलना में अधिक सामान्य दृष्टिकोण है subtotals जो सिंक्रनाइज़िंग की देयता लागू करता है जहां दोनों प्रश्नों पर खंड। आप किसी भी agregate समारोह का भी उपयोग कर सकते हैं, न केवल डीबी पक्ष पर उपलब्ध thoses।