4

これは楽しいものです:-)

EAV に取り組んで、モデルの実行時にジェネリック リレーションシップ ハンドラーを挿入します。

model_clsは任意のクラスであり、EavValueクラスにはそれを指す一般的な関係があります。EavValuesから aまで正常に動作しますmodel_clsが、別の方法では、物事を容易にするためにアクセサーを注入する必要があります。

generic_relation = generic.GenericRelation(EavValue,
                                               object_id_field='entity_id',
                                               content_type_field='entity_ct',
                                               related_name=model_cls.__name__)
generic_relation.contribute_to_class(model_cls, 'eav_values')

繰り返しますが、実行時にこれを行います。これは、触れられないサード パーティのライブラリで動作するようにするためです。

Patientクラスを としてユニットテストしているmodel_clsときに、次のエラーが発生します。

eav_ng.patient: Accessor for m2m field 'eav_values' clashes with related m2m field 'EavValue.Patient'. Add a related_name argument to the definition for 'eav_values'.

contribute_to_classさて、簡単な修正はまたはrelated_nameの2 番目のパラメーターを変更することだと思っていましGenericRelationたが、そうではありません! 名前が異なるだけで、まったく同じエラーが発生します。

2 つ目の奇妙な点として、MySql の代わりに Sqlite を使用して同じ単体テストを実行すると、すべてパスします。

さらに、順序やテストに関係なく、2 回目のテストで常にこのエラーが発生します。このプロセスはメソッド内で発生し、セットアップとティアダウンでregister呼び出されるため、メソッドが不完全であると推測しています。registerunregisterunregister

最後の奇妙な事実: unittest の実行中にエラーが発生しますが、手動で再現することはできません。最悪の場合、私の同僚のコンピューターでは、同じバージョンの Python、Django、Ubuntu、および MySQL を使用しているときにエラーが発生しません。

私たちは多くの難しい問題を解決しましたが、これに行き詰まっているので、手がかりをいただければ幸いです.

アップデート:

この素晴らしいゲームの新しい手がかり:

django.core.management.validation の 245 行目 (django 1.2.1) のこのスニペットからエラーが発生します。

for r in rel_opts.get_all_related_many_to_many_objects():
    if r.field is not f:
        if r.get_accessor_name() == rel_name:
            e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
        if r.get_accessor_name() == rel_query_name:
            e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))

r.get_accessor_name() == rel_nameどちらも「患者」であるため、私たちにとってはTrueです。

更新 2:

registerモデルであるアプリを追加するとき。どのモデルでも、問題は発生しなくなりました。unregister理論はここまで...

我々 は 2 つの対称エラー (関係の両側) にあります。related_nameエラー 0_o の抑制の 1 つを削除する

4

1 に答える 1

1

解決策を見つけた

リストであるモデルクラス_meta.local_many_to_many属性に参照を配置する上で一般的な関係を追加します。Django はそれをチェックしますが、それを取り除く方法はありません。修正は次のとおりです。

    # remove remaining reference to the generic relation
    for field in model_cls._meta.local_many_to_many:
        if field.name == 'eav_value': # your related name
            model_cls._meta.local_many_to_many.remove(field)
            break
于 2010-09-10T12:48:17.220 に答える