将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 中的不同应用程序?