Jag kom på det här. Jag måste säga att jag tror att detta tekniskt sett kvalificeras som en bugg i Odoo.
Sammanfattning
Namnen på mina modeller var för långa. Varje gång du anger ett _name
egendom som är längre än 16 tecken som du ställer in för att eventuellt uppleva det här problemet.
Detaljer
När du skapar en Many2many
relation, skapar odoo en ny databastabell för denna relation och skapar sedan två databasindex för tabellen. Deras namn är följande:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Där <model1>
och <model2>
är _name
egenskap hos en lämplig modell. Du kan observera detta i _m2m_raise_or_create_relation
metod för odoos BaseModel
.
Det finns dock en hake. Som standard indetifierare i PostgreSQL (inklusive indexidentifierare) får inte vara längre än 63 tecken :
Odoo tar inte hänsyn till detta. Det genererar gärna mycket längre identifierare, som sedan trunkeras av PostgreSQL. Om båda identifierarna delar samma första 63 tecken (vilket för längre identifierare är ganska troligt) kommer de att behandlas av PostgreSQL som samma. Det betyder att det första indexet kommer att skapas, men att skapa det andra kommer att resultera i ett fel, eftersom det delar en identifierare som redan användes (åtminstone enligt PostgreSQL).
Så vad är den maximala längden på _name
egendom kan ha samtidigt som man undviker problemet? Det beror på hur många tecken som delas mellan namnen på två modeller i m2m-relation, men för att helt undvika identifierare trunkering bör du aldrig använda namn som är längre än 16 tecken.
Varför 16? PostgreSQL-identifierare får inte vara längre än 63 tecken. I indexidentifierare som genereras av odoo finns det 15 fasta tecken. Det lämnar oss med 48 tecken, som måste rymma tre upprepningar av modellnamn. Detta ger oss i sin tur 16 tecken per enskilt modellnamn.
Ett annat sätt att kringgå problemet skulle vara att manuellt ställa in ett kort relationsnamn via relation
attribut på Many2many
fältet.