在 Django 的 settings.py 中导入模型

Posted

技术标签:

【中文标题】在 Django 的 settings.py 中导入模型【英文标题】:Import model in Django's settings.py 【发布时间】:2016-08-20 00:10:51 【问题描述】:

我正在尝试使用 settings.py 中模型类的值定义一个常量,以便为我的一个模型提供动态定义的 FK:

from catalog.models import Product
PRODUCT_MODEL = Product

毫无疑问它会导致AppRegistryNotReady 异常:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

因为没有调用django.setup() 方法。

如果我添加

import django
django.setup()

在模型的导入前,我得到的不是AppRegistryNotReady 异常

AttributeError: 'Settings' object has no attribute 'PRODUCT_MODEL'

当我使用时

from django.conf import settings
...

product = models.ForeignKey(
    settings.PRODUCT_MODEL, 
    related_name='order_items')

有没有什么方法可以实现这一点而不会出错?

我正在使用 Python 3.5 和 Django 1.9.5。

【问题讨论】:

【参考方案1】:

您不应在设置文件中导入模型或调用django.setup()

改为使用字符串来引用您的模型。

PRODUCT_MODEL = 'catalog.Product'

然后,在您的模型中,您可以使用该设置。

product = models.ForeignKey(
    settings.PRODUCT_MODEL, 
    related_name='order_items',
)

注意AUTH_USER_MODEL 设置使用这样的字符串,您不要在设置文件中导入用户模型。

【讨论】:

是的,“字符串方式”是我最初所做的并且它有效。我只是好奇是否有任何方法可以从 Python 的动态中受益并直接导入类或模块......【参考方案2】:

将模型名称存储为字符串。

在settings.py中:

PRODUCT_MODEL = 'YourModel'

在你的 models.py 中:

from django.apps import AppConfig
....
field = models.ForeignKey(AppConfig.get_model(PRODUCT_MODEL))

(这适用于 Django 1.9。)

【讨论】:

【参考方案3】:

在设置和延迟导入中使用catalog.Product

【讨论】:

以上是关于在 Django 的 settings.py 中导入模型的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中导入设置

Django AUTHENTICATION_BACKENDS 导入错误

Django项目settings.py文件基础配置

django settings多环境配置

django中settings.py中变量的全局引用

django怎样引用settings.py里面的变量