Ho capito questo. Devo dire che penso che tecnicamente si qualifichi come un bug in Odoo.
Riepilogo
I nomi dei miei modelli erano troppo lunghi. Ogni volta che imposti un _name
proprietà più lunga di 16 caratteri che stai configurando per riscontrare potenzialmente questo problema.
Dettagli
Quando crei un Many2many
relazione, odoo imposta una nuova tabella di database per questa relazione e quindi crea due indici di database per la tabella. Il loro nome è il seguente:
<model1>_<model2>_rel_<model1>_id_index
<model1>_<model2>_rel_<model2>_id_index
Dove <model1>
e <model2>
sono il _name
proprietà di un modello appropriato. Puoi osservarlo in _m2m_raise_or_create_relation
metodo del BaseModel
di odoo .
C'è però un problema. Di default indetifiers in PostgreSQL (inclusi gli identificatori di indice) non può essere più lungo di 63 caratteri :
Odoo non ne tiene conto. Genera felicemente identificatori molto più lunghi, che vengono poi troncati da PostgreSQL. Se entrambi gli identificatori condividono gli stessi primi 63 caratteri (cosa molto probabile per identificatori più lunghi) verranno trattati da PostgreSQL come gli stessi. Ciò significa che verrà creato il primo indice, ma la creazione del secondo risulterà in un errore, poiché condivide un identificatore già utilizzato (almeno secondo PostgreSQL).
Quindi qual è la lunghezza massima del _name
la proprietà può avere evitando il problema? Dipende da quanti caratteri sono condivisi tra i nomi di due modelli in relazione m2m, ma per evitare completamente il troncamento dell'identificatore non dovresti mai usare nomi più lunghi di 16 caratteri.
Perché 16? Gli identificatori PostgreSQL non possono essere più lunghi di 63 caratteri. Negli identificatori di indice generati da odoo ci sono 15 caratteri fissi. Questo ci lascia con 48 caratteri, che devono contenere tre ripetizioni dei nomi dei modelli. Questo a sua volta ci lascia con 16 caratteri per il nome del singolo modello.
Un altro modo per aggirare il problema sarebbe impostare manualmente un nome di relazione breve tramite relation
attributo su Many2many
campo.