将Django模型从一个应用程序移动到另一个[重复]

Posted

技术标签:

【中文标题】将Django模型从一个应用程序移动到另一个[重复]【英文标题】:Move Django model from one app to another [duplicate] 【发布时间】:2012-07-14 22:30:39 【问题描述】:

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

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

我考虑过使用db.rename_table,但不知道如何正确更新这些模型的外键(从旧到新)——在数据库级别无关紧要(因为表重命名已经涵盖了这一点),但是在 ORM 级别并非如此。

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

【问题讨论】:

对于django>=1.7,请参阅此帖子:***.com/questions/25648393/… 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

我最近在较小的范围内做了类似的事情,这就是我的过程:

    创建新应用和相应模型 更新视图以使用新模型 更新单元/系统测试以确保没有损坏(重要!) 编写一个管理命令,根据旧模型填充新模型 部署代码 为新模型运行迁移 运行管理命令脚本来更新新模型 将旧应用程序保留 1-2 周,当您认为一切正常时,放弃它们。

我没有使用数据迁移的原因:

    不熟悉 - 觉得任务太重要了,无法使用我不熟悉的流程 使用 Python 代码移动数据比使用 South magic 更舒适 遇到依赖项的南迁移问题。不想通过数据迁移使迁移进一步复杂化。由于我不熟悉数据迁移的机制,这可能是一个错误的假设 也许作为第 3 点的偏见,我说服自己将 South 纯粹用作模式管理工具是“正确”的做法。数据的创建/更新应该在 Django 层中使用夹具或自定义管理命令完成

【讨论】:

数据迁移没有南方魔法,南方所做的只是创建一个存根,在其中填充代码。从这个意义上说,它与使用 python 代码移动数据没有什么不同。我也遇到了迁移和依赖的问题,但通常可以通过按特定顺序迁移应用程序来解决(这些问题也是代码中循环依赖的一个很好的指标,无论如何最好将其删除)。【参考方案3】:

我根本不明白您为什么需要任何数据迁移。

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

【讨论】:

短期,这就是我打算做的。但我不想永远维护我项目的两个分支。最终我想升级旧客户的代码库以匹配新客户,如果可能的话,我宁愿使用默认的表名(但如果成本超过收益,我会这样做)。 这很好用,但它如何与现代 Django 迁移一起工作?

以上是关于将Django模型从一个应用程序移动到另一个[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?

django - 如何将实际图像文件从一个模型复制到另一个模型?

在Django中将模型对象从模型复制到另一个模型

如何将自定义用户模型迁移到 Django 中的不同应用程序?

如何将 Core Data name.xcdatamodel 从一个文件夹移动到另一个文件夹?

通过单击提交按钮将值从一个 jsp 移动到另一个 [重复]