Eu percebi isso. Devo dizer que acho que isso tecnicamente se qualifica como um bug no Odoo.
Resumo
Os nomes dos meus modelos eram muito longos. Toda vez que você definir um
_name
propriedade com mais de 16 caracteres que você está configurando para potencialmente enfrentar esse problema. Detalhes
Quando você cria um
Many2many
relação, odoo configura uma nova tabela de banco de dados para essa relação e, em seguida, cria dois índices de banco de dados para a tabela. Seus nomes são os seguintes:<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Onde
<model1>
e <model2>
são o _name
propriedade de um modelo apropriado. Você pode observar isso em _m2m_raise_or_create_relation
método do BaseModel
do odoo . No entanto, há uma captura. Por padrão identificadores no PostgreSQL (incluindo identificadores de índice) não pode ter mais de 63 caracteres :
Odoo não leva isso em consideração. Felizmente, ele gera identificadores muito mais longos, que são truncados pelo PostgreSQL. Se ambos os identificadores compartilharem os mesmos primeiros 63 caracteres (o que para identificadores mais longos é bastante provável), eles serão tratados pelo PostgreSQL como iguais. Isso significa que o primeiro índice será criado, mas criar o segundo resultará em erro, pois ele compartilha um identificador que já foi usado (pelo menos de acordo com o PostgreSQL).
Então, qual é o comprimento máximo do
_name
propriedade pode ter evitando o problema? Depende de quantos caracteres são compartilhados entre os nomes de dois modelos na relação m2m, mas para evitar totalmente o truncamento do identificador, você nunca deve usar nomes com mais de 16 caracteres. Por que 16? Os identificadores do PostgreSQL não podem ter mais de 63 caracteres. Nos identificadores de índice gerados pelo odoo existem 15 caracteres fixos. Isso nos deixa com 48 caracteres, que precisam acomodar três repetições de nomes de modelos. Isso, por sua vez, nos deixa com 16 caracteres por nome de modelo único.
Outra maneira de contornar o problema seria definir manualmente um nome de relação curto por meio de
relation
atributo no Many2many
campo.