Я понял это. Должен сказать, я считаю, что это технически квалифицируется как ошибка в Odoo.
Резюме
Названия моих моделей были слишком длинными. Каждый раз, когда вы устанавливаете свойство _name
длиной более 16 символов, вы настраиваете себя на потенциальную проблему.
Подробность
При создании Many2many
отношения, odoo брусчаток новой таблицы базы данных для этого отношения, а затем создает два индекса базы данных для таблицы. Их название следующим образом:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Где <model1>
<model2>
и являются _name
собственностью соответствующей модели. Вы можете наблюдать это в _m2m_raise_or_create_relation
методе odoo's BaseModel
.
Существует, однако, один улов. По умолчанию в indetifiers PostgreSQL (inluding идентификаторы индексов) can not be longer than 63 characters:
Система использует не более NAMEDATALEN-1 байт идентификатора; Более длинные имена могут быть записаны в командах, но они будут усечены. По умолчанию NAMEDATALEN равно 64, поэтому максимальная длина идентификатора составляет 63 байт.
Одуо не учитывает это.Он с радостью генерирует гораздо более длинные идентификаторы, которые затем усекаются PostgreSQL. Если оба идентификатора имеют одни и те же первые 63 символа (что для более длинных идентификаторов вполне вероятно), они будут обрабатываться PostgreSQL одинаково. Это означает, что первый индекс будет создан, но создание второго приведет к ошибке, так как он использует уже использованный идентификатор (по крайней мере, согласно PostgreSQL).
И что такое максимальная длина _name
, может возникнуть проблема, если у вас возникли проблемы? Это зависит от того, сколько символов разделено между именами двух моделей в отношении m2m, но чтобы полностью избежать усечения идентификатора, вы никогда не должны использовать имена длиной более 16 символов.
Почему 16? Идентификаторы PostgreSQL не могут быть длиннее 63 символов. В индексных идентификаторах, генерируемых одуем, имеется 15 фиксированных символов. Это оставляет нам 48 символов, которые должны учитывать три повторения имен моделей. Это, в свою очередь, оставляет нас с 16 символами на одно имя модели.
Другим способом решения проблемы было бы вручную задать короткое имя отношения с помощью атрибута relation
на поле Many2many
.
Я создал [билет о проблеме] (https://github.com/odoo/odoo/issues/2780) в системе отслеживания ошибок Odoo. –
Отличная работа! В качестве обходного пути вы можете принудительно ввести имя для имени отношения, добавляющего в поле атрибут 'relation = '''. –
Отличный улов! Сегодня я столкнулся с этой проблемой, так что кажется. – Yenthe