पहले से ही जवाब के माध्यम से चला गया। बस मैंने सोचा कि अगर मैं वास्तविक उदाहरण के साथ उत्तर जोड़ूं तो बेहतर होगा।
मान लीजिए कि आपके पास 3 Django मॉडल हैं जो संबंधित हैं।
class M1(models.Model):
name = models.CharField(max_length=10)
class M2(models.Model):
name = models.CharField(max_length=10)
select_relation = models.ForeignKey(M1, on_delete=models.CASCADE)
prefetch_relation = models.ManyToManyField(to='M3')
class M3(models.Model):
name = models.CharField(max_length=10)
यहाँ आप क्वेरी कर सकता है M2
मॉडल और उसके रिश्तेदार M1
वस्तुओं का उपयोग कर select_relation
क्षेत्र और M3
का उपयोग कर वस्तुओं prefetch_relation
क्षेत्र।
हालाँकि जैसा कि हमने उल्लेख किया है कि यह एक M1
से M2
है ForeignKey
, यह किसी भी वस्तु के लिए केवल 1 रिकॉर्ड देता है M2
। एक ही बात के लिए भी लागू होता है OneToOneField
।
लेकिन इससे वह M3
संबंध M2
है ManyToManyField
जो किसी भी संख्या में M1
वस्तुओं को वापस कर सकता है ।
ऐसे मामले पर विचार करें जहां आपके पास 2 M2
ऑब्जेक्ट हैं m21
, m22
जिनके पास ID के साथ समान 5 संबद्ध M3
ऑब्जेक्ट हैं 1,2,3,4,5
। जब आप M3
उन M2
वस्तुओं में से प्रत्येक के लिए संबद्ध ऑब्जेक्ट लाते हैं, यदि आप संबंधित से संबंधित का उपयोग करते हैं, तो यह इस तरह से काम करने वाला है।
कदम:
m21
वस्तु खोजो ।
M3
ऑब्जेक्ट से संबंधित सभी ऑब्जेक्ट को क्वेरी करें m21
जिनकी आईडी हैं 1,2,3,4,5
।
m22
ऑब्जेक्ट और अन्य सभी M2
वस्तुओं के लिए एक ही बात दोहराएं ।
जैसा कि हम 1,2,3,4,5
दोनों के लिए समान आईडी हैं m21
, m22
ऑब्जेक्ट, यदि हम select_related विकल्प का उपयोग करते हैं, तो यह उसी आईडी के लिए दो बार DB को क्वेरी करने जा रहा है जो पहले से ही प्रचलित थे।
इसके बजाय यदि आप M2
वस्तुओं को प्राप्त करने का प्रयास करते हैं, तो आप प्रीफ़ैचे_रेल्टेड का उपयोग करते हैं, यह सभी आईडी का नोट बना देगा कि आपकी वस्तुएँ वापस आ गईं (नोट: केवल आईडी) M2
तालिका को क्वेरी करते समय और अंतिम चरण के रूप में, Django M3
तालिका में एक क्वेरी बनाने जा रहा है। सभी आईडी के सेट के साथ जो आपकी M2
वस्तुएं वापस आ गई हैं। और M2
डेटाबेस के बजाय पायथन का उपयोग करने वाली वस्तुओं में शामिल हों ।
इस तरह आप सभी M3
वस्तुओं को केवल एक बार क्वेरी कर रहे हैं जो प्रदर्शन को बेहतर बनाता है।