回答:
Django 3.0以降では、
AppConfig.get_model(model_name, require_ready=True)
Django 1.9以降、メソッドは
django.apps.AppConfig.get_model(model_name)
です。
- ダニップ
Django 1.7以降
django.db.models.loading
では、新しいアプリケーションの読み込みシステムのために非推奨になりました(1.9で削除予定)。
- スコット・ウッドオール
それを見つけた。ここで定義されています:
from django.db.models.loading import get_model
として定義:
def get_model(self, app_label, model_name, seed_cache=True):
from django.apps import AppConfig
django.apps.apps.get_model(model_name)
。AppConfigオブジェクトは別の目的のためのものであり、を呼び出すためにAppConfigインスタンスを作成する必要がありますget_model()
。
django.db.models.loading
たジャンゴ1.7で非推奨(1.9で削除、新規の賛成で)アプリケーションローディングシステム。
Django 1.7のドキュメントでは、代わりに次のようになります。
>>> from django.apps import apps
>>> User = apps.get_model(app_label='auth', model_name='User')
>>> print(User)
<class 'django.contrib.auth.models.User'>
ほとんどのモデル「文字列」は「appname.modelname」の形式で表示されるため、get_modelでこのバリエーションを使用することができます。
from django.db.models.loading import get_model
your_model = get_model ( *your_string.split('.',1) )
通常、そのような文字列をモデルに変換するdjangoコードの部分は、もう少し複雑django/db/models/fields/related.py
です。
try:
app_label, model_name = relation.split(".")
except ValueError:
# If we can't split, assume a model in current app
app_label = cls._meta.app_label
model_name = relation
except AttributeError:
# If it doesn't have a split it's actually a model class
app_label = relation._meta.app_label
model_name = relation._meta.object_name
# Try to look up the related model, and if it's already loaded resolve the
# string right away. If get_model returns None, it means that the related
# model isn't loaded yet, so we need to pend the relation until the class
# is prepared.
model = get_model(app_label, model_name,
seed_cache=False, only_installed=False)
私にとって、これはコアコードでこれを単一の関数に分割するための良いケースのようです。ただし、文字列が「App.Model」形式であることがわかっている場合は、上記の2つのライナーが機能します。
your_model = get_model(*your_string.rsplit('.', 1))
。アプリのラベルはドット形式の場合がありますが、モデル名は常に有効な識別子です。
apps.get_model
です。「ショートカットとして、このメソッドはフォームで単一の引数も受け入れますapp_label.model_name
。」
Djangoのどこで行われるかはわかりませんが、これは可能です。
リフレクションを介してクラス名を文字列にマッピングします。
classes = [Person,Child,Parent]
def find_class(name):
for clls in classes:
if clls.__class__.__name__ == name:
return clls
以下は、文字列からクラスを取得するための、それほどジャンゴ固有でないアプローチです:
mymodels = ['ModelA', 'ModelB']
model_list = __import__('<appname>.models', fromlist=mymodels)
model_a = getattr(model_list, 'ModelA')
または、ここに示すようにimportlibを使用できます。
import importlib
myapp_models = importlib.import_module('<appname>.models')
model_a = getattr(myapp_models, 'ModelA')
2020ソリューション:
from django.apps import apps
apps.get_model('app_name', 'Model')
あなたのegあたり:
apps.get_model('people', 'Person')