답변:
장고 3.0 기준으로
AppConfig.get_model(model_name, require_ready=True)
Django 1.9부터 방법은
django.apps.AppConfig.get_model(model_name)
입니다.
- danihp
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 제거 하여 새 찬성) 응용 프로그램 로딩 시스템 .
장고 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/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"형식 인 경우 위의 두 라이너가 작동합니다.
your_model = get_model(*your_string.rsplit('.', 1))
. 앱 레이블은 점으로 표시되는 형식이지만 모델 이름은 항상 유효한 식별자입니다.
apps.get_model
. "바로이 방법은 형식으로 단일 인수를 허용합니다 app_label.model_name
."
장고에서 어디에서했는지 확실하지 않지만이 작업을 수행 할 수 있습니다.
리플렉션을 통해 클래스 이름을 문자열에 매핑
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')
귀하의 예 :
apps.get_model('people', 'Person')