You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大型Django项目迁移问题咨询:分支合并时初始迁移冲突

Django迁移常见问题解决方案

一、何时创建新迁移

  • 只要修改了models.py里的模型定义(新增/删除字段、改字段类型/约束、加索引、变更模型元数据如verbose_name等),就需要创建新迁移。
  • 执行python manage.py makemigrations,Django会自动对比当前模型和已迁移版本的差异,生成对应迁移文件。
  • 注意:仅修改模型的自定义方法(比如save、clean),不需要创建迁移。

二、如何仅迁移指定模型/应用

  • 只为某个应用生成迁移:python manage.py makemigrations <app_name>
  • 仅执行某个应用的迁移:python manage.py migrate <app_name>
  • 针对单个模型生成迁移(Django 3.2+支持):先执行python manage.py makemigrations <app_name> --name <自定义迁移名> --empty生成空迁移文件,再手动在文件里编写该模型的操作(比如AddField、AlterField)。

三、分支合并时初始迁移(0001)冲突的解决

这是多分支开发的常见问题,根源是不同分支都修改了初始模型、生成了各自的0001迁移,合并时冲突。正确解决流程:

  1. 合并前拉取最新develop分支代码
    在功能分支执行:
    git pull origin develop
    
  2. 处理冲突的具体步骤
    • 先把models.py的冲突解决,保留最终正确的模型定义。
    • 删除冲突的两个0001迁移文件。
    • 重新生成初始迁移:
      python manage.py makemigrations <app_name> --name initial
      
    • 让Django识别新迁移替代旧的冲突迁移:
      python manage.py migrate <app_name> --fake-initial
      
      --fake-initial会告诉Django:这些表已经在数据库里了,不用实际创建,只把迁移记录到django_migrations表中。
  3. 预防冲突的方法
    • 开发前先拉取最新develop分支,缩小分支差异。
    • 尽量不要在多个分支同时修改同一个模型的初始定义,必须改的话,先合并到develop再开新分支开发。
    • 上线后的项目,别轻易改初始迁移,后续修改都通过新增迁移实现。

四、替代删迁移+重建数据库的正确操作

脚本删所有迁移和数据库的方法在团队协作或生产环境完全不可行,正确的重置/修复方式:

  • 本地开发环境重置迁移:
    # 清除django_migrations表中对应应用的记录
    python manage.py sqlmigrate <app_name> 0001 | grep "DELETE FROM django_migrations" | python manage.py shell
    # 删除该应用migrations目录下除__init__.py外的所有迁移文件
    rm <app_name>/migrations/0*.py
    # 重新生成迁移并标记为已执行
    python manage.py makemigrations <app_name>
    python manage.py migrate <app_name> --fake-initial
    
  • 生产环境绝对不能删数据库,遇到迁移问题先备份,再用--fake或编写自定义迁移修复。

内容的提问来源于stack exchange,提问作者Saidi Souhaieb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:03:09