在Django的settings.py中导入模型

时间:2016-04-26 09:06:48

标签: python django python-3.x django-models django-settings

我尝试使用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。

3 个答案:

答案 0 :(得分:4)

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

相反,请使用字符串来引用您的模型。

PRODUCT_MODEL = 'catalog.Product'

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

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

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

答案 1 :(得分:2)

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

在settings.py中:

PRODUCT_MODEL = 'YourModel'

在models.py中:

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

(这适用于Django 1.9。)

答案 2 :(得分:0)

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