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

Posted

技术标签:

【中文标题】如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?【英文标题】:How do I migrate data from one model to another using South in Django? 【发布时间】:2010-12-23 21:20:39 【问题描述】:

我创建了一个 Django 应用程序,它有自己的内部投票系统和一个名为 Vote 的模型来跟踪它。我想将投票系统重构为自己的应用程序,以便我可以重用它。但是,原始应用程序正在生产中,我需要创建一个数据迁移,它将获取所有投票并将它们移植到单独的应用程序中。

如何让两个应用参与迁移,以便我可以访问它们的两个模型?不幸的是,原来的和独立的应用程序现在都有一个名为 Vote 的模型,所以我需要注意任何冲突。

【问题讨论】:

【参考方案1】:

你试过db.rename_table吗?

我将首先在看起来像这样的新应用或旧应用中创建迁移。

class Migration:

    def forwards(self, orm):
        db.rename_table('old_vote', 'new_vote')    

    def backwards(self, orm):
        db.rename_table('new_vote', 'old_vote')

如果这不起作用,您可以按照以下方式在循环中迁移每个项目:

def forwards(self, orm):
    for old in orm['old.vote'].objects.all():
        # create a new.Vote with old's data
models = 
    'old.vote' =  ... ,
    'new.vote' =  ... ,

注意:您必须使用orm[...] 访问当前正在迁移的应用程序之外的任何模型。否则,标准 orm.Vote.objects.all() 表示法有效。

【讨论】:

这是一种敏锐的横向思维!我仍然需要获取内容 ID 等才能将 ForeignKey 转换为 GenericForeignKey,但我可以通过一个应用程序完成所有操作。 感谢您的编辑。您的更新比我要进行的更新要简单得多。附带说明一下,如果您的模型中包含 ManyToManyField,请小心。我认为 South 0.6.2 很难让它们正确。

以上是关于如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?的主要内容,如果未能解决你的问题,请参考以下文章

South - 将 django 应用程序从 sqlite 迁移到 mysql

django south 在多个数据库上

从 South 迁移到 Django 1.7 迁移:可交换依赖项

测试使用南迁移的 Django 应用程序

如何使用 django-south 恢复删除的表?

如何对 Django South“数据迁移”进行单元测试