2016-04-26 58 views
2

我试图定义与模型在settings.py类的值恒定为我的车型之一提供了一个动态定义的FK导入模型:在Django的settings.py

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

您不应该在您的设置中输入模型或致电django.setup() fi乐。

而是使用字符串来引用您的模型。

PRODUCT_MODEL = 'catalog.Product' 

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

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

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

+0

是的,“字符串”是我最初做的和它的工作。 我只是好奇,如果有任何方式从Python的动态和直接导入类或模块中受益... –

1

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

在settings.py:

PRODUCT_MODEL = 'YourModel' 

在你的models.py:

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

(这个工作从Django的1.9。)在设置

0

使用catalog.Product和懒惰进口