django.conf.global_settings何时加载?

1 投票
1 回答
1038 浏览
提问于 2025-04-18 03:43

我创建了一个自定义用户模型,使用的是“AbstractUser”模型。

from django.conf.global_settings import AUTH_USER_MODEL    

MyCustomUser(AbstractUser):
    regions = models.ManyToManyField(to='SomeModel')

    class Meta:
        app_label = 'myapp'

MyObject(models.Model):
    owner = models.ForeignKey(to=AUTH_USER_MODEL)

然后我把 AUTH_USER_MODEL 设置在 settings/base.py 文件里(我把设置文件分开来,针对不同的环境,比如:settings/base.py 和 settings/development.py)。

AUTH_USER_MODEL = 'myapp.MyCustomUser'

当我执行 python manage.py syncdb 的时候,我的控制台窗口被Django搞得一团乱!

myapp.MyObject: 'owner' defines a relation with the model 'auth.User', which has been swapped out. Update the relation to point at settings.AUTH_USER_MODEL.

所以,我有两个问题。

  1. 问题是不是因为我把 settings.py 分开到不同的环境了。
  2. 使用 from django.global_settings import AUTH_USER_MODEL 这个语句会导入 myproject.settings 吗?

这次我解决了 from myproject.settings.base import AUTH_USER_MODEL 这个问题。

1 个回答

2

global_settings 就是它名字的意思,代表了Django提供的全局默认设置。所以默认情况下是 'auth.User'。

因为你在自己的设置中进行了覆盖,所以应该导入你自己的设置。不过,正如文档所说,导入当前设置的方式总是 from django.conf import settings,而不是直接导入你项目中的某个设置文件。

另外要注意的是,这里最好不要直接使用设置,因为这样可能会在启动时引发一些依赖问题。你应该使用 get_user_model(),这个函数来自 django.contrib.auth,具体的解释可以参考 文档

撰写回答