在Django中,您可以指定如下关系:
author = ForeignKey('Person')
然后在内部,它必须将字符串"Person“转换为模型Person
。
执行此操作的函数在哪里?我想用它,但我找不到。
发布于 2014-10-01 01:47:33
django.db.models.loading
是deprecated in Django 1.7 (removed in 1.9),支持新的application loading system。
Django 1.7 docs给我们提供了以下内容:
>>> from django.apps import apps
>>> User = apps.get_model(app_label='auth', model_name='User')
>>> print(User)
<class 'django.contrib.auth.models.User'>
发布于 2014-09-11 20:06:53
对于任何遇到困难的人(就像我一样):
from django.apps import apps
model = apps.get_model('app_name', 'model_name')
应该像model_name
一样使用引号列出app_name
(即不要尝试导入它)
get_model
接受小写或大写“model_name”
发布于 2012-11-06 08:02:17
大多数模型“字符串”都以"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“格式的,上面的两行代码就可以工作了。
https://stackoverflow.com/questions/4881607
复制相似问题