2012-03-06 3 views
7

मेरे पास कई विदेशी कुंजी फ़ील्ड के साथ एक मॉडल है, उदाहरण के लिए फ़ील्ड 'प्रकार', 'स्तर', 'रंग', 'तीव्रता' (केवल एक सामान्य उदाहरण) के साथ मॉडल उत्पाद।डीजेगो इनलाइन फॉर्मेट्स और पसंदफील्ड कई डीबी क्वेरीज उत्पन्न करते हैं

मेरे पास extra=10 का उपयोग करके अतिरिक्त उत्पादों की इनलाइन जोड़ने के विकल्प के साथ इनलाइन फॉर्मेट के रूप में उत्पादों के साथ टाइप फॉर्म का उपयोग करके दिए गए प्रकार के सभी उत्पादों को संपादित करने के लिए एक पृष्ठ है।

जो चीज़ मुझे बहुत अजीब लगता है वह यह है कि प्रत्येक बार जब मैं टेम्पलेट पर विदेशी कुंजी विकल्प फ़ील्ड में से एक आउटपुट करता हूं तो Django विकल्प (हर बार) प्राप्त करने के लिए डेटाबेस से पूछताछ करता है।

उदाहरण के लिए:

{% for form in formset %} 
    {{ form.level }} 
    {{ form.color }} 
    {{ form.intensity }} 
{% endfor %} 

20 उत्पादों (और 10 खाली अतिरिक्त रूपों) उपरोक्त कोड जारी करता स्तर, रंग और तीव्रता 90 प्रश्नों के कुल से 30 select * from ... (Django डीबग टूलबार का उपयोग करने से पता चला), जहां 3 के साथ पर्याप्त होना चाहिए। विकल्प मध्य अनुरोध को बदलने की संभावना नहीं है, लेकिन अगर उन्होंने किया तो भी मैं निश्चित रूप से कुछ नए जोड़े गए विकल्पों को केवल अंतिम 5 रूपों में प्रकट नहीं करना चाहता हूं।

क्या मेरे मॉडल/रूप/विचार/टेम्पलेट्स को अनुकूलित करने का कोई तरीका है ताकि डेटाबेस को इस अनावश्यक रूप से हथौड़ा न हो?

-

अस्वीकरण: मैं अपेक्षाकृत django और अजगर करने के लिए नया हूँ और यह सोचकर कि इससे किसी भी तरह का निर्माण करने के लिए एक रास्ता होना चाहिए मदद नहीं कर सकता।

उत्तर

4
field_queryset = Test.objects.all()  
for form in formset: 
     form.fields['test_field'].queryset = field_queryset 

इस तरह।

+0

नाइस डेनिस, समझ में आता है, बस उन्हें सभी एक ही क्वेरीसेट ऑब्जेक्ट का उपयोग करें। उत्तर देने के लिए आपको 11 महीने लग गए और मैं इसे स्वीकार करने के लिए 8 महीने का समय लगा। इस बीच में 'प्रकार', 'स्तर', 'रंग' प्रकारों को पूरी तरह से कैश करके इस आधार पर संबोधित किया गया कि ये बहुत अधिक स्थिरांक हैं जो बदले नहीं जाएंगे। लेकिन धन्यवाद, यह एक साधारण दृष्टिकोण है जिसे मैं अगली बार ध्यान में रखूंगा। – davur

+0

यह काम नहीं करता है। फ़ॉर्म को डिफॉल्ट क्वेरीसेट्स के साथ बनाया जाएगा इससे पहले कि आप उन्हें इस तरह बदल सकें, इसलिए यह बहुत से प्रश्न पूछेगा। –

+1

@ एड्रियान, वास्तव में "हाँ और नहीं" मुझे लगता है। आप सही हैं, डिफ़ॉल्ट क्वेरीसेट शायद फॉर्म कन्स्ट्रक्टर में बनाए जाएंगे। हालांकि, एक क्वेरीसेट बनाना डेटाबेस की क्वेरी के समान नहीं है। यदि आप पहले प्रश्न जारी किए जाने से पहले क्वेरीसेट को प्रतिस्थापित करते हैं तो आप अभी भी सभी अनावश्यक कॉल डेटाबेस में सहेज सकते हैं। टेम्पलेट में पहला फॉर्म प्रदर्शित करने से पहले, और प्रत्येक फॉर्म पर 'सेव' कॉल करने से पहले आपको इन्हें प्रतिस्थापित करना होगा। – davur

1

आप change the queryset used by the formset, तो आप select_related() इस्तेमाल कर सकते हैं कर सकते हैं उत्पन्न करने के लिए FK मिलती बजाय प्रत्येक forloop यात्रा पर एक प्रश्न निष्पादित करने के लिए।

+1

मुझे नहीं पता कि इससे इस स्थिति में कैसे मदद मिलेगी। क्वेरीसेट उत्पादों के वर्तमान मानों का चयन करने के लिए है, और select_related वर्तमान में प्रत्येक उत्पाद से जुड़े स्तर/रंग/तीव्रता वस्तुओं को लाने में मदद कर सकता है। Select_related वास्तव में चयन बॉक्स को पॉप्युलेट करने के लिए चुनिंदा विकल्पों के पूरे सेट को प्रीफ़ेट करने में कैसे मदद करता है? – davur

+0

ठीक है तो आप या तो एजेक्स ऑटोकंपलेट (डीजेंगो-एजेक्स-सिलेक्ट्स) का उपयोग कर सकते हैं या तो एक क्वेरी कैश (जॉनीकेक) का उपयोग कर सकते हैं। – jpic

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