दिलचस्प पोस्ट
JQuery.ajax के बाद अनपेक्षित टोकन बृहदान्त्र JSON सेलेनियम में ज्ञात तत्व का मूल तत्व चुनें उदाहरण के लिए बुरा व्यवहार माना जाता है? यदि हां, तो क्या परिस्थितियों में अभी भी बेहतर है? बूटस्ट्रैप 4 में लंबवत संरेखण push_back बनाम emplace_back फ़ंक्शन कॉल में मैं वैकल्पिक तर्क कैसे छोड़ूँगा? कैसे अजगर में माइक्रोफ़ोन से ध्वनि इनपुट मिलता है, और इसे उड़ने पर संसाधित करता है? WHOIS API कौन प्रदान करता है? .htaccess का उपयोग कर HTTP और HTTPS के बीच सही ढंग से स्विच करना VLOOKUP बनाम इंडेक्स संपत्ति से एंड्रॉइड वेबविव जावास्क्रिप्ट <P: संवाद> के गाया और दृश्यमान विशेषताओं के बीच का अंतर क्यों WCF सूची के बजाय <myObject वापस आती है, जैसे मैं उम्मीद कर रहा था? डीजेंगो में डेटाबेस माइग्रेशन के प्रबंधन के लिए आपका पसंदीदा समाधान क्या है? XmlSerializer और BinaryFormatter के बीच अंतर क्या हैं

Django ORM में select_related और prefetch_related में क्या अंतर है?

Django डॉक्टर में,

select_related () "का पालन करें" विदेशी कुंजी रिश्तों, अतिरिक्त संबंधित-ऑब्जेक्ट डेटा का चयन करते समय यह अपनी क्वेरी निष्पादित करता है

prefetch_related () प्रत्येक रिश्ते के लिए एक अलग लुकअप करता है, और पायथन में 'जॉइनिंग' करता है

"अजगर में शामिल होने" का क्या अर्थ है? क्या कोई उदाहरण के साथ वर्णन कर सकता है?

मेरी समझ है कि विदेशी कुंजी संबंधों के लिए, select_related का उपयोग करें; और एम 2 एम संबंध के लिए, prefetch_related का उपयोग करें क्या ये सही है?

Solutions Collecting From Web of "Django ORM में select_related और prefetch_related में क्या अंतर है?"

आपकी समझ ज्यादातर सही है। आप select_related उपयोग select_related जब आप जिस ऑब्जेक्ट को चुनना चाहते हैं वह एक ऑब्जेक्ट है, इसलिए OneToOneField या ForeignKey जब आप चीजों की एक "सेट" प्राप्त करने जा रहे हैं तो आप prefetch_related उपयोग करते हैं, इसलिए आप के रूप में कई ManyToManyField को उल्टा करते या रिवर्स करते हैं बस इस बात को स्पष्ट करने के लिए कि "रिवर्स ForeignKey " से इसका क्या अर्थ है, यहां एक उदाहरण है:

 class ModelA(models.Model): pass class ModelB(models.Model): a = ForeignKey(ModelA) ModelB.objects.select_related('a').all() # Forward ForeignKey relationship ModelA.objects.prefetch_related('modelb_set').all() # Reverse ForeignKey relationship 

अंतर यह है कि select_related एक एसक्यूएल शामिल है और इसलिए एसक्यूएल सर्वर से तालिका के भाग के रूप में परिणाम वापस प्राप्त होता है दूसरी तरफ prefetch_related एक और क्वेरी को निष्पादित करता है और इसलिए मूल वस्तु में अनावश्यक स्तंभों को कम कर देता है (ऊपर के उदाहरण में ModelA )। आप किसी भी चीज के लिए prefetch_related उपयोग कर सकते हैं जिसे आप के लिए select_related उपयोग कर सकते हैं

व्यापार करनेवाले यह है कि prefetch_related को सर्वर पर वापस जाने के लिए आईडी की एक सूची बना और भेजना है, इसमें कुछ समय लग सकता है। मुझे यकीन नहीं है कि लेनदेन में ऐसा करने का एक अच्छा तरीका है, लेकिन मेरी समझ यह है कि डीजेंगो हमेशा एक सूची भेजता है और कहता है … कहां पीके इन (…, …, …) मूल रूप से। इस मामले में यदि प्रीफ़ेड डेटा विरल है (हम लोगों के पते से जुड़ी यूएस ऑब्जेक्ट ऑब्जेक्ट्स कहते हैं) यह बहुत अच्छा हो सकता है, हालांकि यदि यह एक-से-एक के करीब है, तो इससे बहुत सारे संचार बर्बाद हो सकते हैं अगर संदेह में, दोनों की कोशिश करें और देखें कि कौन बेहतर प्रदर्शन करता है।

ऊपर चर्चा की गई सभी बातें मूल रूप से डेटाबेस के साथ संचार के बारे में हैं पायथन साइड पर हालांकि prefetch_related अतिरिक्त लाभ है कि एक ऑब्जेक्ट डेटाबेस में प्रत्येक वस्तु का प्रतिनिधित्व करने के लिए प्रयोग किया जाता है। प्रत्येक "अभिभावक" ऑब्जेक्ट के लिए select_related डुप्लिकेट ऑब्जेक्ट पायथन में बनाए जाएंगे। चूंकि अजगर में ऑब्जेक्ट्स में मेमोरी ओवरहेड का सभ्य बिट है इसलिए यह एक विचार भी हो सकता है।

दोनों तरीकों से एक ही उद्देश्य प्राप्त होता है, अनावश्यक डीबी प्रश्नों को त्यागने के लिए लेकिन वे दक्षता के लिए अलग-अलग तरीकों का इस्तेमाल करते हैं

इन विधियों में से किसी एक का उपयोग करने का एकमात्र कारण यह है कि जब एक बड़ी क्वेरी कई छोटे प्रश्नों के लिए बेहतर होती है डाटाबेस के लिए मांग प्रश्नों के मुकाबले बजाए, मेमोरी में मॉडल बनाने के लिए डीजेango बड़ी क्वेरी का उपयोग करता है

select_related प्रत्येक लुकअप में शामिल होने के साथ-साथ, सभी शामिल तालिकाओं के कॉलम को शामिल करने के लिए चयन का विस्तार करता है। हालांकि इस दृष्टिकोण में एक चेतावनी है

जुड़ जाता है एक क्वेरी में पंक्तियों की संख्या को गुणा करने की क्षमता होती है। जब आप किसी विदेशी कुंजी या एक-से-एक फ़ील्ड में शामिल हों, तो पंक्तियों की संख्या में वृद्धि नहीं होगी। हालांकि, बहुत-से-कई लोग इस गारंटी नहीं देते हैं इसलिए, Django रिश्तों को select_related लिए प्रतिबंधित करता है, जो अप्रत्याशित रूप से बड़े पैमाने पर शामिल होने में न हो।

prefetch_related लिए "अजगर में शामिल" थोड़ा और अधिक खतरनाक है, तो यह होना चाहिए। इसमें शामिल होने के लिए प्रत्येक तालिका के लिए एक अलग क्वेरी बनाता है यह इनमें से प्रत्येक तालिका को WHERE IN खंड के साथ फ़िल्टर करता है, जैसे:

 SELECT "credential"."id", "credential"."uuid", "credential"."identity_id" FROM "credential" WHERE "credential"."identity_id" IN (84706, 48746, 871441, 84713, 76492, 84621, 51472); 

संभवतः कई पंक्तियों के साथ एक भी शामिल होने के बजाय, प्रत्येक तालिका को एक अलग क्वेरी में विभाजित किया जाता है