升级Django到V2.0后执行迁移报错auth_user不存在,求解决方案
解决Django 2.0迁移时"auth_user does not exist"的问题
我之前升级到Django 2.0时也碰到过完全一样的问题,之前1.8那套migrate auth再全量迁移的方法不管用,折腾了好一阵才找到几个可行的方案,分享给你:
方案一:检查自定义用户模型的迁移顺序(如果用了自定义User)
如果你的项目里设置了AUTH_USER_MODEL自定义用户模型,这很可能是迁移顺序冲突导致的:
- 先把所有非用户模型所在app的迁移文件,临时移到项目根目录的一个临时文件夹(比如
temp_migrations),只保留自定义用户模型所在app的迁移文件 - 执行
python manage.py makemigrations确保用户模型的迁移文件是最新的 - 先跑
python manage.py migrate完成用户模型的迁移 - 把临时文件夹里的迁移文件移回各自app的migrations目录,再执行
python manage.py migrate完成剩余迁移
方案二:重置迁移记录(仅开发环境适用)
如果是开发环境,数据可以重置的话,这个方法最直接:
- 先备份你的数据库(别嫌麻烦,万一出问题还能恢复)
- 删除所有app下migrations文件夹里除了
__init__.py之外的所有迁移文件 - 清空数据库(比如SQLite直接删除
db.sqlite3,MySQL/PostgreSQL则删除对应数据库或清空所有表) - 先执行
python manage.py migrate auth --fake-initial,这个命令会"假装"已经完成auth的初始迁移,避免后续冲突 - 最后执行
python manage.py migrate完成全量迁移
方案三:手动调整迁移文件的依赖关系
有些app的迁移文件可能在auth表创建之前就尝试引用auth_user,这时候需要手动修改迁移文件的依赖:
- 找到报错的那个迁移文件,打开它修改
dependencies列表,把auth的初始迁移加进去:
dependencies = [ ('auth', '0001_initial'), # 保留原来的其他依赖 ]
- 保存后再依次执行
python manage.py migrate auth和python manage.py migrate
另外要提醒一句:Django 2.0对用户模型的校验比旧版本更严格,如果是中途修改AUTH_USER_MODEL的话很容易出问题,最好是项目初始化时就确定好用户模型。
内容的提问来源于stack exchange,提问作者DariusFontaine
相关产品推荐
相关产品推荐

