possible bug in django models -


models.py:

<पूर्व> वर्ग रूट (models.Model): uid_string = मॉडल वर्गफ्रंट (max_length = 255, अनन्य = ट्रू) क्लास ट्री (मॉडल.मॉडेल): यूआईडी_स्ट्रिंग = मॉडेल। फ़िरनाइज (रूट, टू_फ़ील्ड = 'यूआईडी_स्ट्रिंग', डीबी_column = 'uid_string') वर्ग झुडू (मॉडल.मॉडेल): यूआईडी_स्ट्रिंग = मॉडल। विदेश की (मूल, to_field = 'uid_string')

जाहिर है, झाड़ू में कॉलम uid_string_id होगा जबकि कॉलम पेड़ होगा मधुमक्खी uid_string । _id परिशिष्ट को दबाया जाता है

यदि मैं अब एक

  rootentry = root (uid_string = "text") root.save ()  

मुझे मिलता है निम्नलिखित व्यवहार करने वाले विभिन्न व्यवहार:

  & gt; & gt; & gt; Shrubentry = shrub (uid_string_id = rootentry.uid_string) & gt; & gt; & gt; पेरेन्ट्री = ट्री (uid_string = rootentry.uid_string) ट्रेसबैक (सबसे हाल ही में कॉल अंतिम): फ़ाइल "& lt; कंसोल & gt;", पंक्ति 1, & lt; मॉड्यूल & gt; फ़ाइल "/ usr/local/lib/python2.6/site-packages/django/db/models/base.py", पंक्ति 328, __init__ setattr में (स्वयं, फ़ील्ड.नाम, rel_obj) फ़ाइल "/ usr / local / Lib / python2.6 / site-packages / django / db / मॉडल / क्षेत्रों / संबंधित ", पंक्ति 318, __set__ self.field.name में, self.field.rel.to._meta.object_name)) ValueError: नहीं कर सकता असाइन करें "'पाठ'": "tree.uid_string" एक "रूट" उदाहरण होना चाहिए। & Gt; & gt; & gt;  

स्पष्ट रूप से rootentry.uid_string है टेक्स्ट

डीजेंगो बस अपेक्षित बर्ताव कर रहा है यह समझने के लिए कि हम किसी विदेशी कुंजी रिश्ते के मामले में मॉडल क्लास के निर्माता कंट्रोलर को कीवर्ड द्विगुणित करने के तरीकों से क्यों शुरू करेंगे?

  1. रिश्ते के नाम का प्रयोग करें ( uid_string ) इस मामले में, आपको संबंधित मॉडल ( uid_string = rootentry ) का उदाहरण पास करना होगा।

  2. उपयोग करें डेटाबेस फ़ील्ड का नाम ( uid_string_id )। यहां आपको उचित प्रकार के मान को पास करना होगा इसलिए यदि एफके एक पूर्णांक फ़ील्ड को इंगित करता है, तो एक पूर्णांक पास करें; अगर यह पाठ को इंगित करता है, तो एक पाठ उदाहरण आदि पास करें।

अब हमें अपना कोड देखें हम पहली पंक्ति से शुरू करेंगे:

  shrubentry = shrub (uid_string_id = rootentry.uid_string) shrubentry.save () # सुखे   

आपने झाड़ू और रूट के बीच एक संबंध बनाया है, लेकिन इससे लिंक करने के लिए एक कस्टम to_field भी निर्दिष्ट किया है चूंकि यह स्तंभ एक टेक्स्ट फ़ील्ड है, आप rootentry.uid_string को uid_string_id कीवर्ड तर्क (उपरोक्त तंत्र # 2) के मान के रूप में पास कर सकते हैं।

कीवर्ड तर्क के रूप में फ़ील्ड नाम का उपयोग किए बिना, आपने ऊपर क्या किया है यह व्यक्त करने का एक और तरीका है। यह रिश्ते के नाम का उपयोग करने और जड़ का एक उदाहरण (ऊपर सूचीबद्ध तंत्र # 1) को पारित करने के लिए होगा।

  shrubentry = shrub (uid_string = rootentry) shrubentry.save () # सुखा  

अब हमें दूसरी पंक्ति < / Strong>।

  पेरेन्ट्री = पेड़ (यूआईडी_स्ट्रिंग = रूटेंट्री.यूआईडी_स्ट्रिंग) # त्रुटि उठाता है # मान त्रुटि: "'पाठ' असाइन नहीं किया जा सकता है:" tree.uid_string "एक" रूट "उदाहरण होना चाहिए।  

यह रेखा पहली पंक्ति से भिन्न है आप तंत्र # 1 (रिलेशनशिप) का उपयोग कर रहे हैं और इसलिए Django को root की एक उदाहरण की उम्मीद है जो कि कीवर्ड तर्क के मूल्य के रूप में है। यदि आप तंत्र # 2 (फ़ील्ड का नाम) पर स्विच करते हैं:

  पेरेन्ट्री = पेड़ (uid_string_id = rootentry.uid_string) पेन्चरट्री.save () # succeeds  

अब दिलचस्प हिस्सा आता है। यह प्रयास करें:

  पेरेन्ट्री = पेड़ (uid_string_id = rootentry.id) # कोई समस्या नहीं treeentry.save () # उड़ा # इंटीग्रिटी ईर्रर: ... # विवरण: कुंजी (uid_string) = (2 ) तालिका में मौजूद नहीं है "app_root"  

उपर्युक्त स्निपेट काम करता है लेकिन जब आप इसे सहेजने का प्रयास करते हैं तो डेटाबेस root तालिका के _uid_string_ कॉलम में एक कुंजी "2" (अर्थात rootentry.id ) के लिए दिखता है। चूंकि यह वहां नहीं है, इसलिए सेव () विफल हो जाता है।


Comments