Ich habe das herausgefunden. Ich muss sagen, dass ich denke, dass dies technisch gesehen ein Fehler in Odoo ist.
Zusammenfassung
Die Namen meiner Modelle waren zu lang. Jedes Mal, wenn Sie einen _name
festlegen Eigenschaft, die länger als 16 Zeichen ist, stellen Sie sich so ein, dass dieses Problem möglicherweise auftritt.
Einzelheiten
Wenn Sie ein Many2many
erstellen Relation, richtet odoo eine neue Datenbanktabelle für diese Relation ein und erstellt dann zwei Datenbankindizes für die Tabelle. Ihre Namen lauten wie folgt:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Wobei <model1>
und <model2>
sind der _name
Eigenschaft eines geeigneten Modells. Sie können dies in _m2m_raise_or_create_relation
beobachten Methode von odoos BaseModel
.
Es gibt jedoch einen Haken. Standardmäßig Bezeichner in PostgreSQL (einschließlich Indexbezeichner) darf nicht länger als 63 Zeichen sein :
Odoo berücksichtigt dies nicht. Es generiert gerne viel längere Bezeichner, die dann von PostgreSQL abgeschnitten werden. Wenn beide Bezeichner dieselben ersten 63 Zeichen haben (was bei längeren Bezeichnern sehr wahrscheinlich ist), werden sie von PostgreSQL als gleich behandelt. Das bedeutet, dass der erste Index erstellt wird, aber das Erstellen des zweiten führt zu einem Fehler, da er einen bereits verwendeten Bezeichner teilt (zumindest nach PostgreSQL).
Was ist also die maximale Länge von _name
Eigentum haben kann, während das Problem vermieden wird? Es hängt davon ab, wie viele Zeichen sich die Namen zweier Modelle in der m2m-Beziehung teilen, aber um das Abschneiden von Identifikatoren vollständig zu vermeiden, sollten Sie niemals Namen verwenden, die länger als 16 Zeichen sind.
Warum 16? PostgreSQL-Identifikatoren dürfen nicht länger als 63 Zeichen sein. In von Odoo generierten Indexkennungen gibt es 15 feste Zeichen. Damit bleiben uns 48 Zeichen, die drei Wiederholungen von Modellnamen aufnehmen müssen. Dies wiederum lässt uns 16 Zeichen pro einzelnem Modellnamen.
Eine andere Möglichkeit, das Problem zu umgehen, besteht darin, manuell einen kurzen Beziehungsnamen über relation
festzulegen -Attribut auf Many2many
Feld.