编写自定义Django用户模型执行migrate命令时遭遇InconsistentMigrationHistory错误的求助
解决Django自定义用户模型迁移时的InconsistentMigrationHistory错误
这个问题我帮不少开发者排查过,核心原因很明确:你在项目已经执行过初始迁移(尤其是admin应用的迁移)之后,才添加了自定义的Occupier用户模型。Django的admin应用默认依赖内置的User模型,现在你把用户模型换成了自定义的,就导致admin的迁移依赖关系倒过来了——admin的迁移已经先跑到数据库里,它依赖的Occupier迁移却还没执行,所以触发了这个报错。
下面分两种场景给你解决方案:
场景1:新项目,没有重要数据
这是最简单的情况,直接重置迁移和数据库就行:
- 删除项目根目录的
db.sqlite3文件(如果你用的是PostgreSQL等其他数据库,直接删除对应的数据库实例) - 找到你的
Occupier应用下的migrations文件夹,删掉里面除了__init__.py之外的所有文件 - 其他系统应用(比如auth、admin、contenttypes)的migrations文件夹也做同样操作(保留
__init__.py) - 然后依次执行命令:
这样Django会先创建自定义用户模型的表,再处理admin等依赖它的应用迁移。python manage.py makemigrations Occupier python manage.py migrate
场景2:已有重要数据,不能重置数据库
这种情况要谨慎操作,第一步一定要先备份数据库,绝对不能跳过:
- 登录你的数据库终端(比如SQLite用
sqlite3 db.sqlite3,PostgreSQL用psql命令) - 找到
django_migrations表,删除admin应用的迁移记录:DELETE FROM django_migrations WHERE app = 'admin'; - 同时删除
auth、contenttypes这两个和用户模型强相关的应用迁移记录(因为admin依赖它们,而它们又依赖用户模型):DELETE FROM django_migrations WHERE app IN ('auth', 'contenttypes'); - 退出数据库终端,回到项目目录,执行:
这时候Django会重新按照正确的依赖顺序执行迁移——先创建python manage.py migrateOccupier的表,再处理auth、contenttypes,最后是admin。
重要提醒
- 自定义用户模型一定要在项目第一次执行
migrate之前就配置好,也就是在settings.py里先加好AUTH_USER_MODEL = 'Occupier.Occupier',再跑初始迁移,这样就能从根源避免这个问题。 - 如果是中途替换用户模型,Django官方其实不推荐这种操作,因为会牵扯到很多关联表的依赖问题。实在要换的话,建议先写数据迁移脚本,把旧
User表的数据同步到新的Occupier表,再按照上面的步骤调整迁移历史。
内容的提问来源于stack exchange,提问作者SamOccupy
相关产品推荐
相关产品推荐

