2011-01-11 13 views
18

मैं अपने मॉडल में एक क्षेत्र टकराव हो रही है:Django related_name संघर्ष

class Visit(models.Model): 
    user = models.ForeignKey(User) 
    visitor = models.ForeignKey(User) 

Error: One or more models did not validate: 
profiles.visit: Accessor for field 'user' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'user'. 
profiles.visit: Accessor for field 'visitor' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'visitor'. 

क्या एक समझदार 'related_field' आगंतुक मैदान पर उपयोग करने के लिए हो सकता है? यह मॉडल मूल रूप से उन विज़िट का प्रतिनिधित्व करता है जो पर विशेष उपयोगकर्ता की प्रोफ़ाइल पर होते हैं।

क्या मुझे किसी भी विदेशीकी को कईToManyField के साथ प्रतिस्थापित करना चाहिए? तर्क थोड़ा उलझन में है।

संपादित करें: ऐसा लगता है कि यह ठीक है, लेकिन मुझे यकीन है कि यह वही है जो मैं चाहता हूं। :)

class Visit(models.Model): 
     user = models.ForeignKey(User) 
     visitor = models.ForeignKey(User, related_name='visitors') 

उत्तर

9

एक यात्रा अपने आवेदन में एक मजबूत अवधारणा है, तो यह समझ बनाने के जिस तरह से आप परिभाषित किया गया है करने के लिए हो सकता है: यात्रा एक 'उपयोगकर्ता उपयोगकर्ता' और एक 'उपयोगकर्ता आगंतुक' के होते हैं।

अगर, हालांकि, एक यात्रा सिर्फ एक जिस तरह उपयोगकर्ताओं आपस में संबंधित हैं तो शायद आप उपयोगकर्ताओं जो ManyToMany संबंध होना चाहिए। उस उद्देश्य के लिए आपको शायद ManyToManyField.symmetricalUser Profile में उपयोग करना चाहिए (जिसमें आप auth.models.User के साथ आने वाली जानकारी का विस्तार करते हैं)।

किसी भी मामले में, related_name के बारे में, आप कर सकते हैं या तो disable the backwards relation आप उपयोगकर्ता से दौरा तक पहुँचने अगर नहीं किया जाएगा, या कोई उचित नाम, visitor पर user पर इस तरह के रूप visits_to_self और visits_to_others का उपयोग जायें जो कि user.visits_to_self पर कॉल करके उपयोगकर्ता को किसने देखा और user.visits_to_others द्वारा उपयोगकर्ता किसने देखा।

28

जब आप एक ForeignKey है, यह एक संपत्ति संदर्भित मॉडल के लिए मॉडल का नाम प्लस _set साथ नामित पैदा करता है। यहां समस्या यह है कि दोनों विदेशी कुंजी User पर visit_set नामक संपत्ति बनाना चाहते हैं। समाधान उन संबंधित नामों को जोड़ना है जो प्रत्येक विदेशी कुंजी के लिए अलग हैं।

आमतौर पर, मैं संबंधित नामों के लिए बहुवचन का उपयोग करता हूं। इस तरह के मामलों में, मैं संबंधित नाम के लिए एक "के रूप में" खंड जोड़ें:

class Visit(models.Model): 
    user = models.ForeignKey(User, related_name="visitsAsUser") 
    visitor = models.ForeignKey(User, related_name="visitsAsVisitor") 

आप एक ManyToManyField नहीं करना चाहते जब तक आप Visit प्रति Visit प्रति शून्य या अधिक आगंतुकों, या उन हो सकता है।

+5

पैडेंटिक होने के लिए, शायद डीजेगो के नामकरण सम्मेलनों का पालन करना बेहतर होगा। इसलिए, 'विज़िटएएसयूसर "' 'visit_as_user" जैसी कुछ होगी। मैं व्यक्तिगत रूप से 'user_visits" पसंद करूंगा, लेकिन यह सिर्फ व्यक्तिगत वरीयता है। – Johndt6

+0

Django के सम्मेलनों का पालन करने से भी अजीब लगने से व्यवस्थापक में चीज़ें रहती हैं। लेकिन मेरे पास बहुत सारे कोड थे जो उस समय ऊंट केस सम्मेलन का इस्तेमाल करते थे, इसलिए आदत खत्म हो गई। –

+1

बस सोचा कि यह उल्लेख करने लायक था :) नामकरण सम्मेलन न केवल दर्शकों के लिए आसान बनाता है, लेकिन लेखक स्वयं कोड पढ़ने के लिए आसान बनाता है। – Johndt6

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