将Django模型从一个应用程序移动到另一个应用程

时间:2012-07-16 04:36:46

标签: database django django-south schema-migration

我犯了一个愚蠢的错误,就是在同一个Django应用程序中创建了太多的模型,现在我想把它分成3个不同的模型。问题是:在两个客户的站点中已经有生产数据,所以我需要仔细规划任何模式/数据迁移(我正在使用django-south)。我不确定如何继续,任何建议将不胜感激。

(我在Ubuntu服务器12.4 LTS上使用PostgreSQL,如果有任何相关性的话)

我考虑过使用db.rename_table,但无法弄清楚如何正确更新这些模型的外键(从旧到新) - 在数据库级别无关紧要(因为表重命名已经覆盖了) ,但在ORM级别却不是这样。

更新:在考虑之后,在询问了programmmers.SE上的this question后,我决定保持简单,不要担心产品主要版本之间的迁移。短期内,我只会使用db.rename_table来匹配新名称,同时使用db_table作为Daniel Roseman建议,同时将模型保留在旧应用中。升级到主要版本时,我开始使用新应用程序并完全放弃所有迁移(因此,新版本的新安装将“按原样”创建数据库,而不是通过所有历史迁移。)

3 个答案:

答案 0 :(得分:14)

我根本不知道你为什么需要任何数据迁移。

只需将模型移动到新应用程序,然后在内部Meta类中添加db_table设置以指向旧表名。

答案 1 :(得分:3)

我最近在较小规模上做了类似的事情,这是我的过程:

  1. 创建新应用及相应型号
  2. 更新视图以使用新模型
  3. 更新单元/系统测试以确保没有任何损坏(重要!)
  4. 编写一个管理命令,根据旧模型填充新模型
  5. 部署代码
  6. 为新模型运行迁移
  7. 运行管理命令脚本以更新新模型
  8. 将旧应用程序保留1-2周,当您认为一切都很好时,请放弃它们。
  9. 我没有使用数据迁移的原因:

    1. 不熟悉 - 觉得任务太重要了,不能使用我不熟悉的过程
    2. 使用python代码移动数据更加舒适,然后使用South magic
    3. 与依赖关系进入南迁移问题。不希望通过数据迁移进一步使迁移复杂化。由于我不熟悉数据迁移的机制,这可能是一个错误的假设
    4. 也许作为第3点的偏见,我确信自己纯粹使用South作为模式管理工具是“正确”的方法。应使用灯具或自定义管理命令在Django层中创建/更新数据

答案 2 :(得分:1)

我能想到的最简单的解决方案:

  1. 创建一个SchemaMigration,将旧应用中模型的每个外键的类型更改为基本类型(包括内部类型);
  2. 正常创建新应用及其模型;
  3. 执行从旧表到新表的数据迁移;
  4. 创建另一个SchemaMigration,再次将每个基本类型更改为外键,现在指向新表;
  5. 从设置中删除旧应用并删除其表格。
  6. 辛苦,是的,但会做到这一点。我希望有更好的解决方案。