Django में `संबंधित_नाम` का उपयोग किस लिए किया जाता है?


390

खेतों और खेतों के related_nameलिए क्या तर्क उपयोगी है ? उदाहरण के लिए, निम्नलिखित कोड को देखते हुए, इसका क्या प्रभाव है ?ManyToManyFieldForeignKeyrelated_name='maps'

class Map(db.Model):
    members = models.ManyToManyField(User, related_name='maps',
                                     verbose_name=_('members'))

12
@DanielRoseman क्या यह किसी भी तरह प्रदर्शन के लिए अच्छा है या संबंधित अभ्यास के लिए अच्छा है, जब संबंधित संबंध आवश्यक नहीं है?
लजार्रे

10
मैं @ लाजरे के प्रश्न का उत्तर जानने के लिए उत्सुक हूं।
3cheesewheel

1
@ लाजरे - मुझे लगता है कि प्रदर्शन बिल्कुल नहीं बदलेगा। मुझे इसे एक बार FeinCMS सामग्री प्रकारों के साथ उपयोग करना होगा। मुझे व्यक्तिगत रूप से लगता है कि यह हमेशा अच्छा व्यवहार है, related_nameइसलिए यदि आप जानते हैं कि आप इसका उपयोग नहीं करेंगे, तो मुझे लगता है कि यह अच्छी बात है। यह निश्चित रूप से एक व्यक्तिगत राय है।
फ्रांस्वा कॉन्सटेंट

@ 3cheesewheel अब डॉक्स में है: docs.djangoproject.com/en/2.0/ref/models/fields/… + इसका मतलब है कि रिवर्स रिलेशन न बनाएं
पी। मायर नोरे

जवाबों:


529

related_nameविशेषता से रिवर्स संबंध का नाम निर्दिष्ट Userअपने मॉडल में मॉडल वापस।

यदि आप निर्दिष्ट नहीं करते हैं , उदाहरण के लिए related_name, Django स्वचालित रूप से आपके मॉडल के प्रत्यय के साथ एक का उपयोग करता है ।_setUser.map_set.all()

यदि आप निर्दिष्ट करते हैं, जैसे related_name=mapsकि Userमॉडल पर, तब User.map_setभी काम करेगा, लेकिन User.maps.वाक्यविन्यास स्पष्ट रूप से थोड़ा क्लीनर और कम क्लंकी है; उदाहरण के लिए, यदि आपके पास कोई उपयोगकर्ता ऑब्जेक्ट है current_user, तो आप current_user.maps.all()अपने Mapमॉडल के सभी उदाहरण प्राप्त करने के लिए उपयोग कर सकते हैं जिनका संबंध है current_user

Django प्रलेखन अधिक जानकारी के है।


1
ठीक है, मुझे पता है कि यह एक पुरानी पोस्ट है। लेकिन मैं सिर्फ यह पता लगाने की कोशिश कर रहा हूं - संबंधित नाम के अंत में + चाल क्या है? उदाहरण के लिए, related_name='maps+'ऊपर दिए उदाहरण में मैंने क्या किया ?
Sidd

10
अगर आप + जोड़ते हैं, तो django मैपिंग को निष्क्रिय कर देता है
josephmisiti

5
OneToOneField के लिए डिफ़ॉल्ट से संबंधित_नाम छोटा केस क्लास नाम होगा। उदाहरण के लिए दिए गए उदाहरण में यदि सदस्य OneToOnefield होंगे तो "User.map" काम करेगा।
ancho

यदि आप निर्दिष्ट करते हैं related_name, तब _setभी काम करता है django1.11 >??
ईसर किंग्स

9
मैं Django 2.1.3 का उपयोग करता हूं और मैं नोट कर सकता हूं कि वे अनन्य हैं। एक बार related_nameनिर्दिष्ट होने के बाद, _setकोई काम नहीं करता है।
स्टॉकरस्की

82

मौजूदा उत्तर में जोड़ने के लिए - संबंधित नाम एक मामले में 2 FKs मॉडल में एक ही तालिका के लिए इंगित करना चाहिए। उदाहरण के लिए सामग्री के बिल के मामले में

@with_author 
class BOM(models.Model): 
    name = models.CharField(max_length=200,null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    tomaterial =  models.ForeignKey(Material, related_name = 'tomaterial')
    frommaterial =  models.ForeignKey(Material, related_name = 'frommaterial')
    creation_time = models.DateTimeField(auto_now_add=True, blank=True)
    quantity = models.DecimalField(max_digits=19, decimal_places=10)

इसलिए जब आपको इस डेटा का उपयोग करना होगा तो आप केवल संबंधित नाम का उपयोग कर सकते हैं

 bom = material.tomaterial.all().order_by('-creation_time')

यह अन्यथा काम नहीं कर रहा है (कम से कम मैं एक ही तालिका में 2 एफके के मामले में संबंधित नाम के उपयोग को छोड़ने में सक्षम नहीं था)।


2
आपको उनमें से कम से कम एक के लिए संबंधित_नाम चुनना होगा। अन्य एक की आवश्यकता नहीं है।
सेसाबा तोथ

32
related_nameबहुवचन होना चाहिए। क्योंकि फॉरेनके संबंध कई वस्तुओं को वापस करते हैं।
मेसुत टैसी

10

related_nameतर्क आप और अधिक जटिल संबंधित वर्ग के नाम है, तो भी उपयोगी है। उदाहरण के लिए, यदि आपके पास एक विदेशी संबंध है:

class UserMapDataFrame(models.Model):
    user = models.ForeignKey(User) 

UserMapDataFrameसंबंधित से वस्तुओं तक पहुंचने के लिए User, डिफ़ॉल्ट कॉल होगा User.usermapdataframe_set.all(), जिसे पढ़ना काफी कठिन है।

related_nameरिवर्स रिलेशन को प्राप्त करने के लिए आपको सरल या अधिक सुपाठ्य नाम निर्दिष्ट करने की अनुमति देता है। इस स्थिति में, यदि आप निर्दिष्ट करते हैं user = models.ForeignKey(User, related_name='map_data'), तो कॉल तब होगा User.map_data.all()


3

संबंधित नाम पैरामीटर वास्तव में एक विकल्प है। यदि हम इसे सेट नहीं करते हैं, तो Django स्वचालित रूप से हमारे लिए संबंध का दूसरा पक्ष बनाता है। मैप मॉडल के मामले में, Django ने एक map_setविशेषता बनाई होगी , जो m.map_setआपके उदाहरण के माध्यम से एक्सेस करने की अनुमति देगा (m आपके वर्ग उदाहरण के रूप में)। Django उपयोग करता है सूत्र स्ट्रिंग के बाद मॉडल का नाम है _set। संबंधित नाम पैरामीटर इस प्रकार नए व्यवहार प्रदान करने के बजाय केवल Django के डिफ़ॉल्ट को ओवरराइड करता है।


0

prefetch_relatedप्रीफ़ैच डेटा के लिए कई के लिए और कई से एक संबंध डेटा के लिए उपयोग करें। select_relatedएकल मूल्य संबंध से डेटा का चयन करना है। इन दोनों का उपयोग किसी मॉडल से अपने रिश्तों का डेटा प्राप्त करने के लिए किया जाता है। उदाहरण के लिए, आप एक मॉडल और एक मॉडल बनाते हैं जिसका अन्य मॉडलों के साथ संबंध होता है। जब एक रिक्वेस्ट आती है तो आप उनके रिलेशनशिप डेटा के लिए क्वेरी भी करेंगे और Django के पास अपने रिलेशनशिप से डेटा एक्सेस करने के लिए बहुत अच्छे मैकेनिज्म हैं। book.author.nameलेकिन जब आप अपने रिलेशनशिप डेटा को लाने के लिए मॉडल्स की सूची तैयार करते हैं तो Django हर एक रिलेशनशिप डेटा के लिए प्रत्येक रिक्वेस्ट बनाता है। इसे दूर करने के लिए हमारे पास prefetchd_relatedऔरselected_related

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.