これは楽しいものです:-)
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
呼び出されるため、メソッドが不完全であると推測しています。register
unregister
unregister
最後の奇妙な事実: 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 つを削除する