Django拆分models目录后自定义用户模型报未安装错误
问题原因
Django的模型加载机制默认只会识别两种位置的模型:
- app目录下单文件形式的
models.py - app目录下
models包(即带__init__.py的models文件夹)中,被__init__.py显式导入的模型类
你把原models.py拆成models文件夹下的独立文件后,没有在models包的初始化文件里导入AppUser,Django启动时扫描不到这个模型,就会抛出AUTH_USER_MODEL refers to model 'app.AppUser' that has not been installed的错误。
另外注意:AUTH_USER_MODEL的配置格式必须严格遵循app_label.ModelName的形式,不支持加中间模块路径,你之前尝试修改为带models、users_model的写法不符合Django的配置规范,所以会触发格式校验的ValueError。
解决方案
按以下步骤操作即可修复问题:
- 首先在
app/models/路径下新建__init__.py文件(如果已有就直接编辑),把所有定义的模型类显式导入到该文件中,针对你的用户模型需要添加如下内容:
# app/models/__init__.py from .users_model import AppUser, MyUserManager # 其余功能的模型也在此处逐一导入,示例: # from .model_for_feature_1 import Feature1Model # from .model_for_feature_2 import Feature2Model
- 打开
config/settings.py,把AUTH_USER_MODEL恢复为符合规范的配置,不要带多余的路径层级:
AUTH_USER_MODEL = "app.AppUser"
- 修正项目中所有模型的导入路径,避免循环导入问题。比如
admin.py中注册模型时,导入语句要从models包入口引入,不要直接指向子文件:
# app/admin.py 正确写法 from django.contrib import admin from app.models import AppUser admin.site.register(AppUser)
- 如果之前执行迁移生成过错误的残留文件,先清空
app/migrations/目录下除__init__.py之外的所有文件,再重新执行迁移命令即可:
python manage.py makemigrations python manage.py migrate
补充说明:你拆分的serializer、views、urls文件夹也遵循相同的包导入逻辑,要么在对应文件夹的
__init__.py中显式导出需要被外部引用的对象,要么在引用时写全到具体文件的模块路径,否则同样会出现对象找不到的报错。
内容的提问来源于stack exchange,提问作者Emad
相关产品推荐
相关产品推荐

