2016-03-02 4 views
7

少なくとも私にとっては、私のプロジェクトでいくつかのバグを引き起こしています。Djangoのrelated_modelプロパティがModelインスタンスの代わりにstringを返すのはなぜですか?

私はジャンゴ1.9とDjango adminにfield.related_model財産の使用を作り、それがfield.related_model戻っモデルのインスタンスを期待し、私のモデルのいくつかのモデル名を返しているので、時にはそれが失敗したサードパーティ製のDjangoのパッケージ(django-jet)を使用しています。

This is the property defined in Django code:

@cached_property 
def related_model(self): 
    # Can't cache this property until all the models are loaded. 
    apps.check_models_ready() 
    return self.remote_field.model 

私が試したもの:

  • Djangoのrelated_modelではなく@propertyそれが動作し、モデルインスタンスを返し@cached_propertyある場合。
  • field.related_modelの代わりにfield.remote_field.modelを呼び出すと、バグの原因となっている行に機能し、モデルインスタンスが返されます。

ご存知ですか?私は回避策を作ることができますが、私はこの動作がなぜわかるでしょう。

ありがとうございます!

答えて

2

ジェットがメソッドで使用しようとしているため、ここで問題が発生していると思います。これはすべてのアプリが読み込まれる前に実行される可能性があります。私が正しく理解すれば、related_modelの値は最初は文字列であり、モデルの初期化の過程でモデルオブジェクトに置き換えられます。アプリケーションがすべて読み込まれる前にその値を取得しようとすると、モデルの読み込み順序に応じて、文字列またはオブジェクトのいずれかが表示されることがあります。キャッシュされたプロパティなので、その段階で文字列値を取得すると、文字列値がキャッシュされます。

# The mechanism for getting at the related model is slightly odd - 
# ideally, we'd just ask for field.related_model. However, related_model 
# is a cached property, and all the models haven't been loaded yet, so 
# we need to make sure we don't cache a string reference. 

django.db.models.optionsで、例えば、コメントを参照してくださいrelated_nameキャッシュされていないプロパティを作成することで、その問題を回避します。

django.contrib.admin.filters.RelatedFieldListFilterコードでは、related_modelを使用してモデルオブジェクトを取得する代わりに、ユーティリティ関数django.contrib.admin.utils.get_model_from_relation()を使用します。 RelatedFieldAjaxListFilter.field_choices()はおそらく同様のことをしているはずです。

関連する問題