Разбрах това. Трябва да кажа, че мисля, че това технически се квалифицира като грешка в Odoo.
Резюме
Имената на моите модели бяха твърде дълги. Всеки път, когато задавате _name
свойство, по-дълго от 16 знака, настройвате себе си, за да изпитате потенциално този проблем.
Подробности
Когато създадете Mnogo2many
релация, odoo настройва нова таблица на база данни за тази релация и след това създава два индекса на база данни за таблицата. Техните имена са както следва:
_ _rel_ _id_index _ _rel_ _id_index
Където
и <модел2>код> са
_name
свойство на подходящ модел. Можете да наблюдавате това в _m2m_raise_or_create_relation
метод на BaseModel
на odoo .
Има обаче една уловка. Идентификатори по подразбиране в PostgreSQL (включително идентификатори на индекси) не може да бъде по-дълъг от 63 знака :
Odoo не взема това предвид. Той щастливо генерира много по-дълги идентификатори, които след това се съкращават от PostgreSQL. Ако и двата идентификатора споделят едни и същи първи 63 знака (което за по-дълги идентификатори е доста вероятно), те ще бъдат третирани от PostgreSQL като еднакви. Това означава, че първият индекс ще бъде създаден, но създаването на втория ще доведе до грешка, тъй като той споделя идентификатор, който вече е бил използван (поне според PostgreSQL).
И така, каква е максималната дължина на _name
имотът може да има, като избягва проблема? Зависи от това колко знака се споделят между имената на два модела в m2m отношение, но за да избегнете напълно съкращаването на идентификатора, никога не трябва да използвате имена, по-дълги от 16 знака.
Защо 16? PostgreSQL идентификаторите не могат да бъдат по-дълги от 63 знака. В индексните идентификатори, генерирани от odoo, има 15 фиксирани знака. Това ни оставя с 48 знака, които трябва да поемат три повторения на имена на модели. Това от своя страна ни оставя с 16 знака за едно име на модел.
Друг начин за заобикаляне на проблема би бил ръчното задаване на кратко име на релация чрез relation
атрибут на Mnogo2many
поле.