私はこれを理解しました。言わなければならないのは、これは技術的にはOdooのバグと見なされると思います。
概要
モデルの名前が長すぎました。 _name
を設定するたびに この問題が発生する可能性があるために設定している16文字を超えるプロパティ。
詳細strong>
Many2many
を作成するとき リレーション、odooは、このリレーション用に新しいデータベーステーブルを設定し、テーブル用に2つのデータベースインデックスを作成します。それらの名前は次のとおりです。
-
<model1>_<model2>_rel_<model1>_id_index
-
<model1>_<model2>_rel_<model2>_id_index
<model1>
の場所 および<model2>
_name
です 適切なモデルのプロパティ。これは_m2m_raise_or_create_relation
で確認できます。 odooのBaseModel
のメソッド 。
ただし、1つの問題があります。デフォルトでは、PostgreSQLのインデックス(インデックス識別子を含む)63文字を超えることはできません :
Odooはこれを考慮していません。幸いにもはるかに長い識別子が生成され、PostgreSQLによって切り捨てられます。両方の識別子が同じ最初の63文字を共有している場合(長い識別子の場合は非常に可能性が高い)、PostgreSQLでは同じものとして扱われます。つまり、最初のインデックスが作成されますが、2番目のインデックスを作成すると、すでに使用されている識別子を共有しているため、エラーが発生します(少なくともPostgreSQLによると)。
したがって、_name
の最大長はどれくらいですか プロパティは、問題を回避しながら持つことができますか? m2m関係にある2つのモデルの名前間で共有される文字数によって異なりますが、識別子の切り捨てを完全に回避するには、16文字を超える名前を使用しないでください。
なぜ16? PostgreSQL識別子は63文字を超えることはできません。 odooによって生成されたインデックス識別子には15個の固定文字があります。これで48文字が残り、モデル名の3回の繰り返しに対応する必要があります。これにより、単一のモデル名ごとに16文字が残ります。
この問題を回避するもう1つの方法は、relation
を使用して短いリレーション名を手動で設定することです。 Many2many
の属性 フィールド。