在Django中,您可以像这样指定关系:
author = ForeignKey('Person')
然后在内部,它必须将字符串“Person”转换为模型Person
。
执行此操作的函数在哪里? 我想使用它,但我找不到它。
author = ForeignKey('Person')
然后在内部,它必须将字符串“Person”转换为模型Person
。
执行此操作的函数在哪里? 我想使用它,但我找不到它。
AppConfig.get_model(model_name, require_ready=True)
。django.apps.AppConfig.get_model(model_name)
。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):
apps.get_model("应用名称.模型名称")
。 - Ricardo D. Quiroga针对任何遇到困难的人(就像我一样):
from django.apps import apps
model = apps.get_model('app_name', 'model_name')
app_name
应该使用引号列出,model_name
也应该使用引号(即不要尝试导入它)
get_model
可以接受小写或大写的 'model_name'
大多数模型的“字符串”以“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)
your_model = get_model(*your_string.rsplit('.', 1))
。应用标签有时会使用点分格式,但模型名称始终是有效的标识符。 - Rockalliteapps.get_model
中似乎不需要这个了。"作为一种快捷方式,此方法还接受一个以app_label.model_name
形式表示的单个参数。" - Ryne Everett2020 年解决方案:
from django.apps import apps
apps.get_model('app_name', 'Model')
根据您的示例:
apps.get_model('people', 'Person')
在Django 1.7+中执行此操作的祝福方式是:
import django
model_cls = django.apps.apps.get_model('app_name', 'model_name')
所以,在所有框架教程的经典示例中:
import django
entry_cls = django.apps.apps.get_model('blog', 'entry') # Case insensitive
如果您不知道模型位于哪个应用程序中,可以通过以下方式搜索:
如果您不知道模型位於哪个应用程式中,可以透过下列方式搜寻:
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get(model='your_model_name')
model = ct.model_class()
记住,your_model_name 必须为小写。
懒人专用的更少代码版本。在Django 2+中测试通过。
from django.apps import apps
model = apps.get_model("appname.ModelName") # e.g "accounts.User"
appname.modelname
也可以使用。 - undefinedclasses = [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')
或者您可以像这里所示使用importlib:
import importlib
myapp_models = importlib.import_module('<appname>.models')
model_a = getattr(myapp_models, 'ModelA')
django.apps.apps.get_model(model_name)
获得。AppConfig对象用于不同的目的,并且需要创建一个AppConfig实例才能调用get_model()
。 - zloveladyfrom django.apps import apps
然后:apps.get_model('app_name', 'Model')
。 - Williams