जॉइन और सबक्वेरी
संबंधित मॉडल भी लोड करने के लिए क्रमबद्ध करना में एक तालिका से दूसरी तालिका में शामिल होने के लिए, आप निम्नलिखित विधि का उपयोग कर सकते हैं।
-
select_related(related: Union[List, str]) -> QuerySet -
select_all(follow: bool = True) -> QuerySet -
prefetch_related(related: Union[List, str]) -> QuerySet -
नमूना
- मॉडल.लोड () विधि
-
क्वेरी सेट एजेंट
-
QuerysetProxy.select_related(related: Union[List, str])विधि QuerysetProxy.select_all(follow: bool=True)विधिQuerysetProxy.prefetch_related(related: Union[List, str])विधि
प्रासंगिक का चयन करें
select_related(related: Union[List, str]) -> QuerySet
संबंधित मॉडल को एक ही क्वेरी के दौरान प्रीफ़ेयर करने की अनुमति देता है।
चयन \ _ lated का उपयोग करते समय, डेटाबेस के खिलाफ हमेशा केवल एक क्वेरी चलती है, जो माध्य (sometimes complex) शामिल होने से उत्पन्न होता है और बाद में नेस्टेड मॉडल पायथन में संसाधित होते हैं।
संबंधित नमूना प्राप्त करने के लिए, विदेशी कुंजी नाम का उपयोग करें।
संबंधित नमूना संबंधों को जोड़ने के लिए, नामों के बीच दोहरे अंडरस्कोर का उपयोग करें।
!!!नोट यदि आप django से हैं, तो कृपया ध्यान दें कि django में ormar\ _ lated -> से अलग है जिसमें आप केवल एक ही संबंध प्रकार का चयन कर सकते हैं, जबकि ormar में आप एक विदेशी कुंजी संबंध में सहसंबंध का चयन कर सकते हैं, रिवर्स साइड एक विदेशी कुंजी (so वर्चुअल ऑटो-जनरेटेड कुंजी) और MTo क्षेत्र (और इसलिए वर्तमान संस्करण के सभी संबंध)।
!!!टिप यह नियंत्रित करने के लिए कि कौन नमूना फ़ील्ड चयनित हैं, फ़ील्ड () का उपयोग करें और \ _ फ़ील्ड () Queryविधियों को छोड़कर।
!!!टिप मॉडल के क्रमबद्ध करना को नियंत्रित करने के लिए (master or nested), क्रमबद्ध करना का उपयोग करें \ _ by () विधि।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
आप एक स्ट्रिंग या स्ट्रिंग्स की सूची (या फ़ील्ड / फ़ील्ड की सूची) प्रदान कर सकते हैं।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |
M2फ़ील्ड बिल्कुल वैसा ही व्यवहार करता है, जहाँ आप M2फ़ील्ड का नाम दर्ज कर सकते हैं और आपके लिए अंतिम नमूना प्राप्त कर सकते हैं।
!!!चेतावनी: यदि आप सभी प्रश्नों के दौरान फ़ील्ड को गैर-अशक्त (और इसलिए आवश्यक) पर सेट करते हैं, तो गैर-अशक्त मॉडल स्वचालित रूप से पूर्वनिर्मित होते हैं, भले ही आप उन्हें चयन \ _ lated में शामिल न करें।
!!!ध्यान दें कि सभी विधियां जो पंक्तियों को वापस नहीं करती हैं, स्पष्ट रूप से एक Queryउदाहरण लौटाती हैं ताकि आप उन्हें एक साथ लिंक कर सकें
1 2 3 | |
सभी का चयन करें
select_all(follow: bool = False) -> QuerySet
डिफ़ॉल्ट रूप से, जब आप सभी का चयन करते हैं तो कोई भी संबंध लोड नहीं होता है (), और फिर से, चयन \ _ lated () का उपयोग करते समय, आपको उन सभी संबंधों को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होती है जिन्हें लोड किया जाना चाहिए। यदि आप नेस्टेड संबंधों को भी शामिल करना चाहते हैं तो यह बोझिल हो सकता है।
यही कारण है कि चयन \ _ all () पेश किया गया था, इसलिए नमूना के सभी रिश्ते डिफ़ॉल्ट रूप से लोड किए जाते हैं (जैसा कि सभी के विपरीत है) () method).
डिफ़ॉल्ट रूप से, केवल मूल नमूना से संबंधित मॉडल (जिससे क्वेरी चलती है) जोड़े जाते हैं।
यदि आप अनुसरण = सत्य सेट करते हैं, तो यह संबंधित मॉडल के संबंधित मॉडल भी जोड़ता है।
!!!क्रमबद्ध करना में जानकारी एक अनंत लूप में फंसने के लिए नहीं, क्योंकि संबंधित नमूना सेट तक पहुंचने नमूना नमूना सेट तक पहुंचने के लिए माता-पिता के साथ एक संबंध भी बनाए रखता है।
1 2 3 4 | |
नमूना तिथियां इस प्रकार हैं:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
सभी शाखाओं और पतों वाली सभी कंपनियों को चुनने के लिए, आपको बस पूछताछ करने की आवश्यकता है:
1 2 3 4 | |
बेशक, इस मामले में, चुनिंदा \ _ lated में स्पष्ट संबंध नाम जारी करना बहुत आसान है, लेकिन जब आपके कई रिश्ते होते हैं तो चुनिंदा \ _ all () के लाभ स्पष्ट हो जाते हैं।
उदाहरण के लिए, यदि कंपनी के 3 संबंध हैं, और सभी 3 संबंधों के अपने 3 संबंध हैं, तो आपको \ _ lated का चयन करने के लिए 9 संबंध स्ट्रिंग्स जारी करने होंगे, और \ _ all () का चयन करें जो संबंध नाम नहीं बदल सकता है।
!!!ध्यान दें कि आप अन्य Queryविधियों जैसे फ़िल्टर, बहिष्करण \ _ फ़ील्ड्स आदि के साथ \ _ all () का चयन कर सकते हैं। किसी संबंध को बाहर करने के लिए, सिवाय \ _ फ़ील्ड () के साथ कॉल का उपयोग करें (also nested) बाहर करने के लिए रिश्ते का नाम।
प्रीफेच सहसंबंध
prefetch_related(related: Union[List, str]) -> QuerySet
इसे प्रश्नों के दौरान संबंधित मॉडल को प्रीफ़ेच करने की अनुमति है - लेकिन जैसा कि \ _ lated का चयन करने के लिए विरोध किया गया है, प्रत्येक बाद के नमूना को एक अलग डेटाबेस क्वेरी में प्राप्त किया जाता है।
pre\ _ lated के साथ, प्रत्येक नमूना डेटाबेस के खिलाफ एक क्वेरी चलाता है, जो माध्य आप एक के बाद एक कई प्रश्नों को निष्पादित करेंगे।
संबंधित नमूना प्राप्त करने के लिए, विदेशी कुंजी नाम का उपयोग करें।
संबंधित नमूना संबंधों को जोड़ने के लिए, नामों के बीच दोहरे अंडरस्कोर का उपयोग करें।
!!!टिप यह नियंत्रित करने के लिए कि कौन नमूना फ़ील्ड चयनित हैं, फ़ील्ड () का उपयोग करें और \ _ फ़ील्ड () Queryविधियों को छोड़कर।
!!!टिप मॉडल के क्रमबद्ध करना को नियंत्रित करने के लिए (master or nested), क्रमबद्ध करना का उपयोग करें \ _ by () विधि।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
आप एक स्ट्रिंग या स्ट्रिंग्स की सूची प्रदान कर सकते हैं
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
M2फ़ील्ड बिल्कुल वैसा ही व्यवहार करता है, जहाँ आप M2फ़ील्ड का नाम दर्ज कर सकते हैं और आपके लिए अंतिम नमूना प्राप्त कर सकते हैं।
!!!चेतावनी: यदि आप सभी प्रश्नों के दौरान फ़ील्ड को गैर-अशक्त (और इसलिए आवश्यक) पर सेट करते हैं, तो गैर-अशक्त मॉडल स्वचालित रूप से पूर्वनिर्मित होते हैं, भले ही आप उन्हें चयन \ _ lated में शामिल न करें।
!!!ध्यान दें कि सभी विधियां जो पंक्तियों को वापस नहीं करती हैं, स्पष्ट रूप से एक Queryउदाहरण लौटाती हैं ताकि आप उन्हें एक साथ लिंक कर सकें
1 2 3 | |
सहसंबंध बनाम प्रीफेच सहसंबंध का चयन करें
आपको किस -> का चयन करना चाहिए \ _ lated या pre\ _ lated का उपयोग करना चाहिए?
खैर, यह वास्तव में आपके डेटा पर निर्भर करता है। सबसे अच्छा जवाब यह है कि इसे अपने लिए आज़माएं और देखें कि कौन सा आपकी सिस्टम सीमाओं के भीतर तेजी से / बेहतर प्रदर्शन करता है।
क्या याद रखें:
प्रदर्शन
प्रश्नों की संख्या: का चयन करें \ _ lated हमेशा डेटाबेस के खिलाफ एक क्वेरी करता है, जबकि pre\ _ lated कई प्रश्न करता है। क्वेरी (I / O) संचालन आमतौर पर होते हैं, लेकिन जरूरी नहीं कि सबसे धीमा।
पंक्तियों की संख्या: मान लीजिए कि तालिका ए में 10,000 वस्तुएं हैं, प्रत्येक वस्तु में तालिका बी में 3 बाल वस्तुएं हैं, और फिर तालिका बी में प्रत्येक वस्तु में तालिका सी में 2 बाल वस्तुएं हैं।
1 2 3 4 5 6 7 8 9 10 11 | |
यह माध्य जो \ _ lated का चयन करता है, हमेशा 60 000 पंक्तियों को लौटाएगा (10 000 * 3 * 2), बाद में 10,000 मॉडल तक संकुचित हो गया।
कितनी लाइनें प्रीफेच \ _ लेटेड वापस आएंगी?
खैर, यह निर्भर करता है, यदि प्रत्येक मॉडल बी और सी अद्वितीय है, तो यह पहली क्वेरी में 10,000 पंक्तियों और दूसरी क्वेरी में 30,000 पंक्तियों को लौटाएगा (तालिका बी में ए के 3 सबआइटम) इनमें से प्रत्येक अद्वितीय है), और 60,000 पंक्तियाँ (तालिका बी में प्रत्येक बच्चा अद्वितीय है)। तालिका सी में मॉडल बी के 2 बच्चे तीसरी क्वेरी में अद्वितीय हैं)।
इस मामले में, का चयन करें \ _ lated एक बेहतर विकल्प की तरह लगता है, न केवल यह 3 pre\ _ lated की तुलना में एक क्वेरी चलाएगा, बल्कि यह 100 000 pre\ _ lated की तुलना में 60 वापस आ जाएगा (10 + 30 + 60k) 000 लाइनें।
लेकिन क्या होगा अगर हर नमूना ए में ठीक उसी तरह के तीन नमूना बी हैं, और हर नमूना सी में ठीक उसी तरह नमूना सी है? का चयन करें \ _ lated अभी भी 60,000 पंक्तियों को लौटाएगा, जबकि pre\ _ lated नमूना A के लिए 10,000 पंक्तियाँ, नमूना B के लिए 3 पंक्तियाँ और नमूना C के लिए 2 पंक्तियाँ लौटाएगा। तो कुल 10,006 पंक्तियाँ। अब, नमूना की संरचना के आधार पर (यानी, अगर यह एक लंबा पाठ है () field, etc.), pre\ _ lated तेज हो सकता है, हालांकि इसे एक के बजाय तीन अलग-अलग प्रश्नों को निष्पादित करने की आवश्यकता है।
मेमोरी
लोड किए गए मॉडल के लिए regeको बनाए नहीं रखता है।
यह माध्य कि ऊपर दिए गए चुनिंदा \ _ lated उदाहरण में, आपके पास हमेशा 10,000 मॉडल A, 30,000 मॉडल B होंगे (भले ही डेटाबेस में अद्वितीय पंक्तियों की संख्या 3 हो - चयन \ _ lated प्रसंस्करण प्रत्येक माता-पिता के लिए एक नया उत्पन्न करता नमूना सबमॉडल)। और 60 000 मॉडल सी।
यदि पंक्तियाँ 1, 10, 100, आदि समान नमूना B साझा करती हैं, और आप उनमें से एक को अपडेट करते हैं, तो शेष पंक्तियाँ जो समान बच्चे को साझा करती हैं, उन्हें तुरंत अपडेट नहीं किया जाएगा। यदि आप डेटाबेस में अपने परिवर्तनों को सहेजते हैं, तो परिवर्तन केवल पुनः लोड करने के बाद उपलब्ध होते हैं (प्रत्येक चाइल्ड आइटम को व्यक्तिगत रूप से लोड करना या संपूर्ण क्वेरी को पुनः लोड करना)। यह माध्य जो \ _ lated का चयन करता है, अधिक मेमोरी का उपयोग करेगा क्योंकि प्रत्येक चाइल्ड ऑब्जेक्ट एक नई ऑब्जेक्ट के रूप में त्वरित है
- जाहिर है, उन्होंने अपने स्थान का उपयोग किया।
!!!ध्यान रखें कि यदि हम कैशिंग शुरू करने का निर्णय लेते हैं तो यह भविष्य की रिलीज में बदल सकता है।
चेतावनी: डिफ़ॉल्ट रूप से, सभी बच्चे (या घटनाएं जहां एक ही नमूना दो बार से अधिक लोड किया जाता है) पूरी तरह से अलग और अलग पायथन ऑब्जेक्ट हैं, भले ही वे डेटाबेस में एक ही पंक्ति का प्रतिनिधित्व करते हों।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
इसके बजाय, pre\ _ lated के साथ, प्रत्येक विशिष्ट रूप से अलग बच्चे नमूना केवल एक बार तत्काल किया जाता है, और एक ही बच्चे नमूना सभी माता-पिता मॉडल के बीच साझा किया जाता है। यह माध्य कि ऊपर दिए गए pre\ _ lated उदाहरण में, यदि तालिका B में 3 अलग-अलग मॉडल हैं और तालिका C में 2 अलग-अलग मॉडल हैं, तो सभी मॉडल A उदाहरणों के बीच केवल 5 सबनेस्टेड मॉडल साझा किए जाएंगे। यह भी माध्य है कि यदि आप किसी भी संपत्ति को अपडेट करते हैं, तो सभी मूल ऑब्जेक्ट उस संपत्ति को अपडेट करेंगे क्योंकि वे एक ही चाइल्ड ऑब्जेक्ट साझा करते हैं।
नमूना विधि
प्रत्येक नमूना उदाहरण में स्वयं को सहेजने, अपडेट करने या लोड करने के तरीकों का एक सेट होता है।
लोड
आप लोड () विधि को कॉल करके एक विदेशी कुंजी संबंधित नमूना लोड कर सकते हैं।
लोड () का उपयोग डेटाबेस से नमूना को ताज़ा करने के लिए किया जा सकता है यदि इसे किसी अन्य प्रक्रिया द्वारा बदल दिया गया है।
!!!टिप नमूना विधि में लोड () विधि के बारे में अधिक पढ़ें
QueryProविधि
प्रासंगिक MToफ़ील्ड और seसीधे एक्सेस करते समय, संबंधित मॉडल की एक सूची वापस आ जाती है।
लेकिन यह क्वेरीसेट एपीआई के एक सबसेट को भी उजागर करता है, इसलिए आप मूल नमूना से सीधे संबंधित मॉडल को फ़िल्टर कर सकते हैं, बना सकते हैं, चुन सकते हैं।
प्रासंगिक का चयन करें
बिल्कुल ऊपर दिए गए चुनिंदा \ _ lated फ़ंक्शन के समान है, लेकिन आपको रिश्ते के दूसरे छोर से संबंधित ऑब्जेक्ट प्राप्त करने की अनुमति देता है।
!!!QueryProके बारे में अधिक जानने के लिए, QueryProअनुभाग पर जाएं
सभी का चयन करें
बिल्कुल ऊपर दिए गए चयन \ _ सभी फ़ंक्शन के समान है, लेकिन आपको रिश्ते के दूसरे छोर से संबंधित ऑब्जेक्ट प्राप्त करने की अनुमति देता है।
!!!QueryProके बारे में अधिक जानने के लिए, QueryProअनुभाग पर जाएं
प्रीफेच सहसंबंध
वास्तव में ऊपर दिए गए pre\ _ lated फ़ंक्शन के समान है, लेकिन आपको रिश्ते के दूसरे छोर से संबंधित वस्तुओं को लाने की अनुमति देता है।
!!!QueryProके बारे में अधिक जानने के लिए, QueryProअनुभाग पर जाएं