Django执行migrate时无法创建自定义User模型对应的auth_user表
问题原因
- 核心原因是未在项目配置中声明自定义用户模型替换Django内置默认用户:你没有在
settings.py中添加AUTH_USER_MODEL = 'admin_portal.User'配置项,Django会默认使用内置的auth.User模型,内置auth应用、第三方依赖包(如报错中的knox)都会默认查找auth_user表,不会识别你自定义的admin_portal.User模型。 - 迁移逻辑冲突:你给自定义User模型指定了
db_table = 'auth_user',和内置auth应用默认要创建的用户表表名完全一致,又没有配置AUTH_USER_MODEL告诉Django用你自定义的模型替代内置模型,迁移执行时出现表名冲突,你的自定义模型建表逻辑被隐式跳过。你看到admin_portal.0001_initial显示应用成功,只是Django记录了迁移的执行状态,实际auth_user表并未被创建。
解决方法
如果是开发环境、无重要业务数据,推荐按以下步骤重置迁移:
- 清空当前数据库中所有已创建的表,或者直接重建数据库
- 删除
admin_portal/migrations/目录下除了__init__.py之外的所有迁移文件 - 打开项目的
settings.py,添加配置:
AUTH_USER_MODEL = 'admin_portal.User'
- 重新生成自定义用户模型的迁移文件:
python3 manage.py makemigrations admin_portal - 执行全量迁移:
python3 manage.py migrate
如果是生产环境不可清空数据,需要手动调整迁移依赖:
修改auth应用的0001_initial迁移文件,添加依赖项指向你admin_portal的初始迁移,让Django优先执行你自定义用户的建表逻辑,跳过内置auth应用的auth_user表创建步骤,该操作风险较高,建议提前备份数据。
内容的提问来源于stack exchange,提问作者azteker
相关产品推荐
相关产品推荐

