Rozgryzłem to. Muszę powiedzieć, że myślę, że technicznie kwalifikuje się to jako błąd w Odoo.
Podsumowanie
Nazwiska moich modeli były za długie. Za każdym razem, gdy ustawisz _name
właściwość dłuższa niż 16 znaków, którą ustawiasz, aby potencjalnie napotkać ten problem.
Szczegóły
Kiedy tworzysz Many2many
relacji, odoo tworzy nową tabelę bazy danych dla tej relacji, a następnie tworzy dwa indeksy bazy danych dla tej tabeli. Ich nazwa brzmi:
_ _rel_ _id_index _ _rel_ _id_index
Gdzie
są _name
właściwość odpowiedniego modelu. Możesz to zaobserwować w _m2m_raise_or_create_relation
metoda BaseModelu
odoo .
Jest jednak jeden haczyk. Domyślnie indetifiers w PostgreSQL (w tym identyfikatory indeksu) nie może mieć więcej niż 63 znaki :
Odoo nie bierze tego pod uwagę. Z radością generuje znacznie dłuższe identyfikatory, które są następnie obcinane przez PostgreSQL. Jeśli oba identyfikatory mają te same pierwsze 63 znaki (co w przypadku dłuższych identyfikatorów jest całkiem prawdopodobne), zostaną one potraktowane przez PostgreSQL jako takie same. Oznacza to, że zostanie utworzony pierwszy indeks, ale utworzenie drugiego spowoduje błąd, ponieważ posiada on identyfikator, który był już używany (przynajmniej według PostgreSQL).
Więc jaka jest maksymalna długość _name
nieruchomość może mieć unikając problemu? Zależy to od tego, ile znaków jest współdzielonych między nazwami dwóch modeli w relacji m2m, ale aby w pełni uniknąć obcięcia identyfikatora, nigdy nie należy używać nazw dłuższych niż 16 znaków.
Dlaczego 16? Identyfikatory PostgreSQL nie mogą być dłuższe niż 63 znaki. W identyfikatorach indeksów generowanych przez odoo znajduje się 15 stałych znaków. Pozostaje nam 48 znaków, które muszą pomieścić trzy powtórzenia nazw modeli. To z kolei pozostawia nam 16 znaków na jedną nazwę modelu.
Innym sposobem obejścia tego problemu byłoby ręczne ustawienie krótkiej nazwy relacji za pomocą relacji
atrybut w Many2many
pole.