首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django:从字符串中获取模型?

Django:从字符串中获取模型?
EN

Stack Overflow用户
提问于 2011-02-03 08:41:27
回答 9查看 89.3K关注 0票数 160

在Django中,您可以指定如下关系:

代码语言:javascript
复制
author = ForeignKey('Person')

然后在内部,它必须将字符串"Person“转换为模型Person

执行此操作的函数在哪里?我想用它,但我找不到。

EN

回答 9

Stack Overflow用户

发布于 2014-10-01 01:47:33

django.db.models.loadingdeprecated in Django 1.7 (removed in 1.9),支持新的application loading system

Django 1.7 docs给我们提供了以下内容:

代码语言:javascript
复制
>>> from django.apps import apps
>>> User = apps.get_model(app_label='auth', model_name='User')
>>> print(User)
<class 'django.contrib.auth.models.User'>
票数 151
EN

Stack Overflow用户

发布于 2014-09-11 20:06:53

对于任何遇到困难的人(就像我一样):

代码语言:javascript
复制
from django.apps import apps

model = apps.get_model('app_name', 'model_name')

应该像model_name一样使用引号列出app_name (即不要尝试导入它)

get_model接受小写或大写“model_name”

票数 76
EN

Stack Overflow用户

发布于 2012-11-06 08:02:17

大多数模型“字符串”都以"appname.modelname“的形式出现,因此您可能希望在get_model上使用此变体

代码语言:javascript
复制
from django.db.models.loading import get_model

your_model = get_model ( *your_string.split('.',1) )

通常将这些字符串转换为模型的django代码部分要稍微复杂一些,这来自django/db/models/fields/related.py

代码语言:javascript
复制
    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“格式的,上面的两行代码就可以工作了。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4881607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档