मैंने यह पता लगा लिया। मुझे कहना होगा, मुझे लगता है कि यह तकनीकी रूप से ओडू में एक बग के रूप में योग्य है।
सारांश
मेरे मॉडलों के नाम बहुत लंबे थे। हर बार जब आप _name
. सेट करते हैं संभावित रूप से इस समस्या का अनुभव करने के लिए 16 वर्णों से अधिक लंबी संपत्ति जिसे आप स्वयं सेट कर रहे हैं।
विवरण
जब आप एक Many2many
बनाते हैं संबंध, ओडू इस संबंध के लिए एक नई डेटाबेस तालिका स्थापित करता है और फिर तालिका के लिए दो डेटाबेस अनुक्रमणिका बनाता है। उनके नाम इस प्रकार हैं:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
जहां <model1>
और <model2>
_name
हैं एक उपयुक्त मॉडल की संपत्ति। आप इसे _m2m_raise_or_create_relation
. में देख सकते हैं ओडू की विधि BaseModel
।
हालांकि एक कैच है। PostgreSQL (इंडेक्स आइडेंटिफ़ायर सहित) में डिफ़ॉल्ट इंडिफ़ायर द्वारा 63 वर्णों से अधिक लंबा नहीं हो सकता :
Odoo इसे ध्यान में नहीं रखता है। यह खुशी से बहुत लंबे पहचानकर्ता उत्पन्न करता है, जिसे बाद में PostgreSQL द्वारा छोटा कर दिया जाता है। यदि दोनों पहचानकर्ता समान पहले 63 वर्ण साझा करते हैं (जो कि लंबे समय तक पहचानकर्ताओं के लिए काफी संभावना है) तो उन्हें PostgreSQL द्वारा समान माना जाएगा। इसका मतलब है कि पहला इंडेक्स बनाया जाएगा, लेकिन दूसरा बनाने से एक त्रुटि होगी, क्योंकि यह एक पहचानकर्ता को साझा करता है जो पहले से ही इस्तेमाल किया गया था (कम से कम पोस्टग्रेएसक्यूएल के अनुसार)।
तो _name
. की अधिकतम लंबाई क्या है? संपत्ति समस्या से बचने के दौरान हो सकती है? यह इस बात पर निर्भर करता है कि m2m संबंध में दो मॉडलों के नामों के बीच कितने वर्ण साझा किए गए हैं, लेकिन पहचानकर्ता काट-छाँट से पूरी तरह बचने के लिए आपको कभी भी 16 वर्णों से अधिक लंबे नामों का उपयोग नहीं करना चाहिए।
16 क्यों? PostgreSQL पहचानकर्ता 63 वर्णों से अधिक लंबा नहीं हो सकता है। ओडू द्वारा उत्पन्न सूचकांक पहचानकर्ताओं में 15 निश्चित वर्ण होते हैं। यह हमें 48 वर्णों के साथ छोड़ देता है, जिन्हें मॉडल नामों की तीन पुनरावृत्तियों को समायोजित करना होता है। यह बदले में हमें प्रति एकल मॉडल नाम 16 वर्णों के साथ छोड़ देता है।
समस्या को हल करने का दूसरा तरीका यह होगा कि relation
. के माध्यम से मैन्युअल रूप से एक संक्षिप्त संबंध नाम सेट किया जाए Many2many
. पर विशेषता फ़ील्ड.