Přišel jsem na to. Musím říct, že si myslím, že se to technicky kvalifikuje jako chyba v Odoo.
Shrnutí
Názvy mých modelů byly příliš dlouhé. Pokaždé, když nastavíte _name
vlastnost delší než 16 znaků, kterou si nastavujete, aby se mohl tento problém vyskytnout.
Podrobnosti
Když vytvoříte Many2many
vztahu, odoo nastaví pro tento vztah novou databázovou tabulku a poté pro tabulku vytvoří dva databázové indexy. Jejich název je následující:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Kde <model1>
a <model2>
jsou _name
vlastnost vhodného modelu. Můžete to pozorovat v _m2m_raise_or_create_relation
metoda BaseModel
odeo .
Má to však jeden háček. Ve výchozím nastavení identifikátory v PostgreSQL (včetně indexových identifikátorů) nesmí být delší než 63 znaků :
Odoo to nebere v úvahu. Vesele generuje mnohem delší identifikátory, které pak PostgreSQL zkrátí. Pokud oba identifikátory sdílejí stejných prvních 63 znaků (což je u delších identifikátorů docela pravděpodobné), bude je PostgreSQL považovat za stejné. To znamená, že první index bude vytvořen, ale vytvoření druhého bude mít za následek chybu, protože sdílí identifikátor, který již byl použit (alespoň podle PostgreSQL).
Jaká je tedy maximální délka _name
majetek může mít a zároveň se vyhnout problému? Záleží na tom, kolik znaků je sdíleno mezi názvy dvou modelů ve vztahu m2m, ale abyste se plně vyhnuli zkrácení identifikátoru, neměli byste nikdy používat názvy delší než 16 znaků.
Proč 16? Identifikátory PostgreSQL nemohou být delší než 63 znaků. V indexových identifikátorech generovaných odeo je 15 pevných znaků. Zbývá nám tedy 48 znaků, které musí pojmout tři opakování názvů modelů. To nám zase zbývá 16 znaků na jeden název modelu.
Dalším způsobem, jak problém vyřešit, je ručně nastavit krátký název vztahu pomocí relation
atribut na Many2many
pole.