2012-02-19 14 views
25

मैं रेल की पृष्ठभूमि से आ रहा हूं, और मुझे Django में प्रदान किए गए "एसोसिएशन तरीके" का उपयोग करने में कुछ परेशानी हो रही है। मैं दो मॉडल (जो संक्षिप्तता की खातिर सरलीकृत किया गया है), इसलिए की तरह है:Django ManyToMany रिश्ते के 'रिवर्स' का उपयोग कैसे करें?

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    companies = models.ManyToManyField('Company', blank=True) 

class Company(models.Model): 
    name = models.CharField(max_length=255) 

Django प्रलेखन के अनुसार:

"यह कोई फर्क नहीं पड़ता कि कौन सा मॉडल ManyToManyField है, लेकिन आपको इसे केवल मॉडल में से एक में रखना चाहिए - दोनों नहीं। "

तो मैं समझता हूँ कि अगर मैं एक उपयोगकर्ता का एक उदाहरण है, उपयोगकर्ता कहा जाता है, मैं कर सकते हैं:

user.companies 

मेरे सवाल यह है कि मैं रिवर्स करते है? मैं कंपनी के उदाहरण से संबंधित सभी उपयोगकर्ताओं को कैसे प्राप्त करूं, मान लें कि कंपनी:

company.users # This doesn't work! 

ऐसा करने के लिए सम्मेलन क्या है? जो दस्तावेज़ मैंने पढ़ा है वह वास्तव में इसे कवर नहीं करता है। मुझे दोनों तरीकों से काम करने के लिए एसोसिएशन की ज़रूरत है, इसलिए मैं इसे एक मॉडल से दूसरे मॉडल में नहीं ले जा सकता।

उत्तर

48
company.user_set.all() 

User वस्तुओं है कि एक विशेष कंपनी के हैं की एक क्वेरीसमूह वापस आ जाएगी। डिफ़ॉल्ट रूप से आप modelname_set का उपयोग संबंध उल्टा करने के लिए, लेकिन आप त्वरित जवाब के लिए धन्यवाद ओवरराइड, जब मॉडल को परिभाषित करने के लिए इस एक पैरामीटर के रूप में एक related_name प्रदान करें, अर्थात

class User(models.Model): 
    companies = models.ManyToManyField(User, ..., related_name="users") 

> company.users.all() 

here is the relevant documentation

+0

बिल्कुल सही जवाब कर सकते हैं। संबंधित_नाम के लिए –

+3

+1। हमेशा * नफरत * 'model_set' वाक्यविन्यास। यह बहुत गंदा लग रहा है। –

+0

मुझे लगता है कि यह मुझे _lazy_ लगता है। कक्षा के नामों के आधार पर उचित पीछे संबंधों का अनुमान लगाना मुश्किल नहीं है। संबंधित_नाम हालांकि इसके साथ काम करना अधिक आसान बनाता है। –

संबंधित मुद्दे