Answers:
从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中删除),以支持新的应用程序加载系统。
- 斯科特·伍德(Scott Woodall)
找到了。它在这里定义:
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
在Django 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”格式,则上面的两个衬里将起作用。
your_model = get_model(*your_string.rsplit('.', 1))
。应用标签有时为点分格式,但是型号名称始终是有效的标识符。
apps.get_model
。“作为快捷方式,此方法还接受形式为的单个参数app_label.model_name
。”
如果您不知道模型存在于哪个应用程序中,可以通过以下方式进行搜索:
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get(model='your_model_name')
model = ct.model_class()
请记住,your_model_name必须为小写。
我不确定它在Django中完成了什么,但是您可以这样做。
通过反射将类名映射到字符串。
classes = [Person,Child,Parent]
def find_class(name):
for clls in classes:
if clls.__class__.__name__ == name:
return clls
这是从字符串中获取类的一种不太Django的方法:
mymodels = ['ModelA', 'ModelB']
model_list = __import__('<appname>.models', fromlist=mymodels)
model_a = getattr(model_list, 'ModelA')
或者你可以使用导入库如图所示在这里:
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')
per: 导入错误:无法导入名称get_model