पहले से ही जवाब के माध्यम से चला गया। बस मैंने सोचा कि अगर मैं वास्तविक उदाहरण के साथ उत्तर जोड़ूं तो बेहतर होगा।
मान लीजिए कि आपके पास 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वस्तुओं को केवल एक बार क्वेरी कर रहे हैं जो प्रदर्शन को बेहतर बनाता है।