sql >> Base de Datos >  >> RDS >> PostgreSQL

la relación ya existe después de agregar un campo Many2many en odoo

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.