Ik heb dit bedacht. Ik moet zeggen, ik denk dat dit technisch gezien kwalificeert als een bug in Odoo.
Samenvatting
De namen van mijn modellen waren te lang. Elke keer dat u een _name
. instelt eigenschap langer dan 16 tekens die u voor uzelf instelt om dit probleem mogelijk te ervaren.
Details
Wanneer u een Many2many
. aanmaakt relatie, stelt odoo een nieuwe databasetabel in voor deze relatie en maakt vervolgens twee database-indexen voor de tabel. Hun naam is als volgt:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Waar <model1>
en <model2>
zijn de _name
eigenschap van een geschikt model. Je kunt dit zien in _m2m_raise_or_create_relation
methode van odoo's BaseModel
.
Er is echter één vangst. Standaard indetifiers in PostgreSQL (inclusief index-ID's) mag niet langer zijn dan 63 tekens :
Odoo houdt hier geen rekening mee. Het genereert gelukkig veel langere identifiers, die vervolgens worden afgekapt door PostgreSQL. Als beide identifiers dezelfde eerste 63 tekens delen (wat voor langere identifiers vrij waarschijnlijk is), zullen ze door PostgreSQL als hetzelfde worden behandeld. Dat betekent dat de eerste index wordt gemaakt, maar het maken van de tweede resulteert in een fout, omdat deze een identifier deelt die al werd gebruikt (althans volgens PostgreSQL).
Dus wat is de maximale lengte van de _name
eigendom kan hebben, terwijl het vermijden van het probleem? Het hangt af van het aantal tekens dat wordt gedeeld tussen de namen van twee modellen in een m2m-relatie, maar om het afbreken van de ID volledig te voorkomen, mag u nooit namen gebruiken die langer zijn dan 16 tekens.
Waarom 16? PostgreSQL-ID's mogen niet langer zijn dan 63 tekens. In index-ID's die door odoo worden gegenereerd, zijn er 15 vaste tekens. Dat laat ons met 48 karakters, die drie herhalingen van modelnamen moeten accommoderen. Dit geeft ons op zijn beurt 16 tekens per modelnaam.
Een andere manier om het probleem te omzeilen is om handmatig een korte relatienaam in te stellen via relation
attribuut op de Many2many
veld.