Django执行迁移后所有migrations重复、冲突报错解决方法
问题根因
这个冲突不是自定义应用的迁移写错了,也不是数据库的问题——你看到的所有带2后缀的重复迁移条目,都是Django扫描迁移文件时,把内置的django.contrib系列应用(admin/auth/contenttypes/sessions)的同一套迁移文件重复加载了两次导致的。
出现重复加载基本是两类配置错误:
settings.py里的INSTALLED_APPS列表重复注册了上述内置contrib应用,同一个app被Django初始化了两次- Python模块搜索路径配置异常,Django的安装目录被重复加入搜索路径,或者项目目录下存在和内置contrib应用重名的模块/文件夹,导致迁移扫描时同一批文件被识别了两次
这也是为什么你删掉自己项目的迁移文件、清空数据库完全解决不了问题——冲突的根本来源是Django内置应用的迁移被重复读取,和项目本身的业务文件没关系。
修复步骤
别直接跑报错里提示的python manage.py makemigrations --merge,这个命令是用来解决多分支开发产生的正常迁移分叉的,对这种重复加载导致的假冲突没用,反而会生成多余的垃圾迁移文件。按下面顺序操作即可:
- 打开项目的
settings.py,逐行检查INSTALLED_APPS配置,确保django.contrib.admin、django.contrib.auth、django.contrib.contenttypes、django.contrib.sessions这几个内置应用每个只出现一次,删掉重复的条目。 - 排查路径重复问题:
- 在激活虚拟环境的终端执行
python -c "import django; print(django.__path__)",拿到Django包的实际安装位置 - 检查项目根目录、所有被加入
PYTHONPATH的目录下,有没有不小心拷贝进来的Django contrib模块,或者自己新建的、和内置app重名的文件夹(比如自己建了叫admin/auth的目录),如果有直接删除。
- 在激活虚拟环境的终端执行
- 清理残留的错误缓存和文件:
- 删除所有应用下
migrations目录里除__init__.py之外的所有文件 - 递归删除项目下所有
__pycache__缓存目录 - 删掉旧的数据库文件(sqlite直接删
db.sqlite3,MySQL/PostgreSQL直接新建空库替换旧的连接配置)
- 删除所有应用下
- 重新执行初始化迁移:
python manage.py makemigrations python manage.py migrate - 执行完后跑
python manage.py showmigrations验证,此时每个迁移条目只会出现一次,且前面带有[X]的已应用标记,再执行python manage.py createsuperuser就不会报冲突错误了。
内容的提问来源于stack exchange,提问作者MartynaMajch
相关产品推荐
相关产品推荐

