Jeg fandt ud af det. Jeg må sige, jeg tror, at dette teknisk set kvalificerer som en fejl i Odoo.
Oversigt
Navnene på mine modeller var for lange. Hver gang du angiver et _name
egenskab længere end 16 tegn, du indstiller dig selv til potentielt at opleve dette problem.
Detaljer
Når du opretter en Many2many
relation, opretter odoo en ny databasetabel for denne relation og opretter derefter to databaseindekser til tabellen. Deres navn er som følger:
__ _rel_ _id_index __ _rel_ _id_index
Hvor
er _name
egenskab af en passende model. Du kan observere dette i _m2m_raise_or_create_relation
metode til odoo's BaseModel
.
Der er dog én fangst. Som standard indetifiers i PostgreSQL (inklusive indeks-id'er) må ikke være længere end 63 tegn :
Odoo tager ikke højde for dette. Det genererer heldigvis meget længere identifikatorer, som derefter afkortes af PostgreSQL. Hvis begge identifikatorer deler de samme første 63 tegn (hvilket for længere identifikatorer er ret sandsynligt), vil de blive behandlet af PostgreSQL som det samme. Det betyder, at det første indeks vil blive oprettet, men at oprette det andet vil resultere i en fejl, da det deler en identifikator, der allerede blev brugt (i det mindste ifølge PostgreSQL).
Så hvad er den maksimale længde af _name
ejendom kan have og samtidig undgå problemet? Det afhænger af, hvor mange tegn der deles mellem navnene på to modeller i m2m relation, men for fuldt ud at undgå identifikatorafkortning bør du aldrig bruge navne på mere end 16 tegn.
Hvorfor 16? PostgreSQL-id'er må ikke være længere end 63 tegn. I indeksidentifikatorer genereret af odoo er der 15 faste tegn. Det efterlader os med 48 tegn, som skal rumme tre gentagelser af modelnavne. Dette efterlader os igen med 16 tegn pr. enkelt modelnavn.
En anden måde at løse problemet på ville være manuelt at indstille et kort relationsnavn via relation
attribut på Many2many
felt.