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

将老旧Django 0.97应用数据迁移至Django 1.8及更高版本的最优方案

从Django 0.97迁移数据到1.8的最优方案

既然你已经把models适配到1.8,空实例能正常跑,那核心问题就是数据的导出-转换-导入,我之前处理过类似的老版本迁移,给你梳理下最稳妥的步骤:

第一步:从旧0.97应用导出数据

先确保旧应用能正常启动(哪怕临时搭个极简环境),然后用Django自带的dumpdata命令导出全量数据:

python manage.py dumpdata --natural-foreign --natural-primary > old_data.json
  • --natural-foreign和--natural-primary是关键:用「自然键」(比如用户名、唯一标识字段)代替数据库主键ID导出,避免导入新实例时因为主键冲突导致失败(新实例的表会重新生成主键序列)。
  • 如果数据量很大,可以指定导出特定app,比如只导你的业务app和auth模块:
    python manage.py dumpdata your_app auth > old_data.json
    

第二步:预处理导出的JSON数据

这一步是为了适配1.8的模型结构,你需要检查以下几点并调整:

  • App名称/模型名变更:如果你的app在新环境里改了名字(比如旧叫old_app新叫new_app),批量替换JSON里的"model": "old_app.XXX"为"model": "new_app.XXX"。
  • 字段名变更:如果models里修改了字段名(比如旧user_name新username),同样批量替换JSON中的字段键。
  • 字段类型兼容:比如0.97的BooleanField可能存的是0/1,dumpdata会自动转成JSON的true/false,但如果是自定义字段,可能需要手动调整格式;另外1.8新增的字段(比如User模型的is_active)如果旧数据没有,导入时会用默认值,不用额外处理。
  • 清理冗余数据:可以删掉django_session、django_admin_log这类临时/日志表的数据,这些在新环境里重新生成即可。

第三步:在新1.8应用中导入数据

先确保新应用的数据库已经做好初始化:

python manage.py migrate

然后导入预处理后的JSON:

python manage.py loaddata old_data.json
  • 如果遇到主键冲突或者表已存在数据的错误,可以先清空目标表(比如用python manage.py shell执行删除操作),或者导入时排除冲突的表:
    python manage.py loaddata old_data.json --exclude auth.user
    
  • 要是导入时触发了自定义信号(比如自动生成关联数据)导致报错,可以临时注释掉信号注册代码,导入完成后再恢复。

第四步:验证数据完整性

导入完成后,一定要做全面测试:

  • 登录admin UI,检查每个模型的数据是否完整,关联关系(比如ForeignKey、ManyToMany)是否正常。
  • 跑几个核心业务查询(比如通过shell查询关联数据),确认字段值没有异常。
  • 检查用户权限、组等auth数据是否正确导入。

备选方案:直接数据库迁移(适合数据量极大的场景)

如果你的models结构和旧版本几乎一致,也可以直接操作数据库:

  1. 导出旧0.97数据库的业务表(避开django_*开头的系统表)。
  2. 在新1.8数据库中创建好表结构(用migrate命令)。
  3. 将旧表数据导入新表,注意调整字段类型(比如旧数据库的datetime格式是否和新数据库兼容)。
  4. 重新生成Django的系统表数据(比如django_content_type,可以通过migrate自动生成)。

这种方法效率更高,但需要你熟悉数据库结构,风险也稍大,建议先在测试环境验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:31:46