2015-06-30 8 views
5

मुझे एक प्रीफैच क्वेरीसेट चुड़ैल के साथ एक django टेम्पलेट को प्रस्तुत करते समय एक प्रदर्शन समस्या है, वास्तव में बड़ा नहीं है (उत्पादन वातावरण में ~ 1000 वस्तुओं/~ 200 वस्तुओं को विकास पर्यावरण में) लेकिन इसमें घोंसले के कई स्तर हैं।Django टेम्पलेट प्रतिपादन गति

stories = Story.objects.select_related(
      'commande', 
      'commande__societe', 
      'commande__plateforme', 
      'client',).prefetch_related(
      Prefetch('crm_message_related', 
        queryset=Message.objects.select_related(
         'societe', 
         'plateforme', 
         'type_message').order_by('-date_received')), 
      Prefetch('commande__crm_feedback_related'), 
      Prefetch('commande__crm_guarantee_related'), 
      Prefetch('commande__soyouz_item_related', 
        queryset=Item.objects.select_related(
         'etat', 'produit', 'produit__produit_enhanced',)), 
      Prefetch('commande__tagged_items__tag'), 
      Prefetch('commande__soyouz_item_related__tagged_items__tag'), 
      Prefetch('commande__soyouz_item_related__soyouz_annulationclient_related'), 
      Prefetch('commande__soyouz_item_related__soyouz_achat_related'), 
      Prefetch('commande__soyouz_item_related__soyouz_achat_related__soyouz_receptionachat_related'), 
      Prefetch('commande__soyouz_item_related__soyouz_achat_related__soyouz_annulationachat_related'), 
      Prefetch('soyouz_action_related'), 
      Prefetch('soyouz_action_related__receptionmessage__message', 
        to_attr='receptionmessages', 
        queryset=Message.objects.order_by(
         '-date_received').select_related(
         'societe', 'type_message', 'plateforme')) 
     ).order_by(
      '-commande__date_commande', 
      '-date_created' 
     ).all().distinct() 

एसक्यूएल सुचारू रूप से चलाने, thats मुद्दा नहीं:

यहाँ प्रीफ़ेच है।

मुद्दा है जब मैं रेंडर करने के लिए मेरे टेम्पलेट डायन मूल रूप से

{% for story in stories %} 
    {% with items=story.commande.soyouz_item_related.all %} 
    {% for item in items %} 
     {% for tag in item.tagged_items.all %} 
      <button>{{ tag.tag }}</button> 
     {% endfor %} 
     {{ item.titre|safe|truncatechars:50 }} 
    {% endfor %} 
{% endfor %} 

है यह उत्पादन वातावरण में पृष्ठ प्रदर्शित करने के बारे में 10 सेकंड लेता है की कोशिश करो।

name   Times Tot Time Queries Queries Time 
stories.html 1  2814,1 ms 0   0 ms 

3 200 डेटा के साथ 3 छोरों के लिए सेकंड (विकास के वातावरण में):

मैं Django-टेम्पलेट समय (https://github.com/orf/django-debug-toolbar-template-timings) और वास्तव में के साथ अपने विकास के वातावरण में यह प्रोफाइल? यह बहुत कुछ लगता है।

टेम्पलेट प्रतिपादन की गति में सुधार करने के लिए कोई विचार?

बहुत बहुत धन्यवाद!

+0

क्या आपने 'DEBUG = False' के साथ प्रयास किया है? Django की टेम्पलेट भाषा इसकी गति के लिए ज्ञात नहीं है, लेकिन यह अत्यधिक लगता है, और मुझे विश्वास नहीं है कि loops विशेष रूप से धीमी हैं।बस यह सुनिश्चित करने के लिए: क्या आप 200 कहानियों, टैग, कुल वस्तुओं के बारे में बात कर रहे हैं? – knbk

+0

देव में: 200 कहानियां - 1 आइटम प्रति कहानी - 0 टैग प्रति आइटम प्रोड में: 1000 कहानियां - 1 या 2 आइटम प्रति कहानी - 1 आइटम प्रति आइटम – Tigrou

+0

DEBUG = गलत पहले से ही उत्पादन वातावरण में सेट है – Tigrou

उत्तर

0

कस्टम टैग का उपयोग करें और टेम्पलेट के बाहर आउटपुट जेनरेट करें। इससे django टेम्पलेट ओवरहेड से बचने में मदद मिलेगी।

5

हालांकि django-template-time प्रतिपादन समय 2.8s होने की रिपोर्ट करता है, मुझे संदेह है कि अधिकांश समय जटिल SQL क्वेरी निष्पादित करने में खपत होती है।

Django में, QuerySets are evaluated lazily। इसका मतलब है, आपके द्वारा पोस्ट किया गया कथन Story.objects.select_related(...).distinct() डेटाबेस में क्वेरी निष्पादित नहीं करता है। एसक्यूएल later निष्पादित हो जाता है। चूंकि आपने टेम्पलेट को प्रस्तुत करने से पहले सभी कोड पोस्ट नहीं किए हैं, इसलिए मुझे यकीन नहीं है कि प्रतिपादन से पहले QuerySet का मूल्यांकन किया जाता है या नहीं।

{% for story in stories %} 

यदि यह मामला है, तो हो सकता है आपके एसक्यूएल में सुधार के समय को कम कर सकते हैं: यदि नहीं, तो यह जब टेम्पलेट में stories पुनरावृत्ति क्रियान्वित किया जा सकता है।

आप देख सकते हैं एसक्यूएल निष्पादन टेम्पलेट प्रतिपादन से पहले इस डालने से दोषी है:

stories = [story for story in stories] 

यह यात्रा एसक्यूएल प्रतिपादन से पहले मार डाला जाता है। इसके बाद, यदि django-template-timeing बहुत कम प्रतिपादन समय रिपोर्ट करता है, तो आप जानते हैं कि SQL समस्या है।

  1. एक अधिक performant टेम्पलेट इंजन का उपयोग करें, Jinja2 की तरह:

    तो यह वास्तव में एक टेम्पलेट प्रतिपादन प्रदर्शन मुद्दा है, वहाँ कुछ विकल्प हैं।

  2. संभावनाएं हैं Django टेम्पलेट के साथ प्रतिपादन प्रदर्शन में सुधार के लिए जगह है: https://stackoverflow.com/a/26592207/954376
+0

हमें सबसे अच्छा समाधान मिला : जिन्जा + जब संभव हो तो पेजिनेट – chocobn69

संबंधित मुद्दे