Me di cuenta de esto. Tengo que decir que creo que técnicamente esto califica como un error en Odoo.
Resumen
Los nombres de mis modelos eran demasiado largos. Cada vez que establece un _name
propiedad de más de 16 caracteres que está configurando para experimentar este problema.
Detalles
Cuando creas un Many2many
relación, odoo configura una nueva tabla de base de datos para esta relación y luego crea dos índices de base de datos para la tabla. Sus nombres son los siguientes:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Donde <model1>
y <model2>
son los _name
propiedad de un modelo apropiado. Puedes observar esto en _m2m_raise_or_create_relation
método de BaseModel
de odoo .
Sin embargo, hay una trampa. Identificadores predeterminados en PostgreSQL (incluidos los identificadores de índice) no puede tener más de 63 caracteres :
Odoo no tiene esto en cuenta. Felizmente genera identificadores mucho más largos, que luego son truncados por PostgreSQL. Si ambos identificadores comparten los mismos primeros 63 caracteres (lo que es bastante probable para identificadores más largos), PostgreSQL los tratará como iguales. Eso significa que se creará el primer índice, pero crear el segundo dará como resultado un error, ya que comparte un identificador que ya se usó (al menos según PostgreSQL).
Entonces, ¿cuál es la longitud máxima del _name
propiedad puede tener evitando el problema? Depende de cuántos caracteres se comparten entre los nombres de dos modelos en relación m2m, pero para evitar por completo el truncamiento del identificador, nunca debe usar nombres de más de 16 caracteres.
¿Por qué 16? Los identificadores de PostgreSQL no pueden tener más de 63 caracteres. En los identificadores de índice generados por odoo hay 15 caracteres fijos. Eso nos deja con 48 caracteres, que tienen que acomodar tres repeticiones de nombres de modelos. Esto, a su vez, nos deja con 16 caracteres por nombre de modelo único.
Otra forma de solucionar el problema sería establecer manualmente un nombre de relación corto a través de relation
atributo en el Many2many
campo.