1. ホーム
  2. django

django: モデルをそのモデルのインスタンスから取得するベストプラクティスな方法

2023-10-26 03:23:29

質問

質問 my_instance はモデル MyModel .

という良い方法を探しています。

my_model = get_model_for_instance(my_instance)

私はこれを行うための本当に直接的な方法を見つけられませんでした。 今のところ、私はこれを思いつきました。

from django.db.models import get_model

my_model = get_model(my_instance._meta.app_label, my_instance.__class__.__name__)

これは受け入れられることなのでしょうか?確実な、ベストプラクティスの方法と言えるのでしょうか?

また _meta.object_name と同じものを提供するようです。 __class__.__name__ . そうなのでしょうか?良いのですか、悪いのですか?もしそうなら、なぜですか?

また、例えば 'django.contrib.auth' の 'auth' と 'myproject.auth' のように、アプリのラベルがプロジェクトの範囲内で複数回発生する場合、正しいモデルを取得しているとどうしたら分かりますか?

このような場合 get_model は信頼できないのでしょうか?

ヒント/ポインタと経験の共有に感謝します!

どのように解決するのですか?

my_model = type(my_instance)

それを証明するために、別のインスタンスを作成することができます。

my_new_instance = type(my_instance)()

このように、pythonのオブジェクトにはすでにこの機能があるため、直接的な方法がないのです。

更新されました...

私が好きなのは marcinnさんのレス を使った type(x) . これは元の答えが使っていたものと同じです ( x.__class__ ) と同じですが、私は魔法の属性にアクセスするよりも、関数を使う方が好きです。このように、私は vars(x) から x.__dict__ , len(x) から x.__len__ といった具合です。

updated 2...

遅延されたインスタンス(コメントで @Cerin が言及しています)については、元のクラスに instance._meta.proxy_for_model .