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

Database 将Django模型从一个应用程序移动到另一个应用程序,database,django,django-south,schema-migration,Database,Django,Django South,Schema Migration,我犯了一个愚蠢的错误,在同一个Django应用程序中创建了太多的模型,现在我想把它分成3个不同的模型。问题是:在两个客户的站点中已经有数据在生产中,所以我需要仔细规划要完成的任何模式/数据迁移(我使用的是django south)。我不确定如何进行,如有任何建议,将不胜感激 (我正在Ubuntu服务器12.4 LTS上使用PostgreSQL,如果这与此相关的话) 我考虑过使用,但不知道如何正确地将外键更新到那些模型(从旧到新)-在数据库级别不相关(因为表重命名已经涵盖了这一点),但在ORM级别

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

(我正在Ubuntu服务器12.4 LTS上使用PostgreSQL,如果这与此相关的话)

我考虑过使用,但不知道如何正确地将外键更新到那些模型(从旧到新)-在数据库级别不相关(因为表重命名已经涵盖了这一点),但在ORM级别则不是这样


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

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

  • 创建一个
    SchemaMigration
    将旧应用程序中模型的每个外键的类型更改为基本类型(包括其内部的外键)
  • 正常创建新应用及其模型
  • 执行从旧表到新表的数据迁移
  • 创建另一个
    SchemaMigration
    ,再次将每个原语类型更改为外键,现在指向新表
  • 从设置中删除旧应用并删除其表

  • 很辛苦,是的,但会成功的。不过,我希望有更好的解决方案。

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

  • 创建新的应用程序和相应的模型
  • 更新视图以使用新模型
  • 更新单元/系统测试以确保没有任何损坏(重要!)
  • 编写一个管理命令,根据旧模型填充新模型
  • 部署代码
  • 为新模型运行迁移
  • 运行管理命令脚本以更新新模型
  • 将旧应用程序保留1-2周,当您认为它一切都好时,将其删除 我没有使用数据迁移的原因如下:

  • 不熟悉--觉得任务太重要,无法使用我不熟悉的流程
  • 使用python代码移动数据比使用South magic更方便
  • 遇到了依赖性的南部移民问题。不想通过数据迁移使迁移进一步复杂化。这可能是一个错误的假设,因为我不熟悉数据迁移的机制
  • 也许出于对第3点的偏见,我确信使用South作为模式管理工具是正确的做法。应在Django层中使用fixture或自定义管理命令创建/更新数据

  • 我完全不明白您为什么需要任何数据迁移


    只需将模型移动到新应用程序,并在内部元类中添加一个设置,以指向旧表名。

    短期内,这就是我计划要做的。但我不想永远维持我项目的两个分支。最后,我想升级老客户的代码库以匹配新客户的代码库,如果可能的话,我宁愿使用默认的表名(但如果成本大于收益,则会使用默认的表名)。这非常有效,但这在现代Django迁移中如何起作用呢?数据迁移没有南方魔法,south所做的只是创建一个存根,在其中填充代码。从这个意义上讲,它与使用python代码移动数据没有什么不同。我在迁移和依赖性方面也遇到过问题,但通常可以通过按特定顺序迁移应用程序来解决(这些问题也是代码中循环依赖性的一个很好的指标,最好还是删除它们)。有关
    django>=1.7
    的信息,请参阅本文: