【问题标题】:Example south schema migration for inserting a model in a hierarchy用于在层次结构中插入模型的示例南模式迁移
【发布时间】:2014-01-31 10:49:26
【问题描述】:

努力思考如何实现这一点:希望看到以前做过的人的例子!

假设,之前:

class A(models.Model):
    pass

class B(A)
    pass

而我想要达到的情况是:

class A(models.Model):
    pass

class C(A):
    pass

class B(C):
    pass

我将如何为此编写南迁?我需要进行“数据迁移”吗?

【问题讨论】:

    标签: django django-south


    【解决方案1】:

    这就是我最终解决问题的方法(这是一个 4 步过程)。仍然有兴趣看看这是否可以改进/简化。

    1) 将新模型创建为独立模型,例如。

    class C(models.Model):
        pass
    

    然后进行自动架构迁移(例如:schemamigration app_name --auto

    2) 使用自定义数据迁移使用来自 class A 的数据填充新模型 C。例如运行datamigration app_name populate_C 来创建一个迁移骨架,并使用来自A 的现有id 填充新模型的id

    def forwards(self, orm):
        for a in orm.A.objects.all():
            c = orm.C(id=a.id)
            c.save()
    

    3) 现在自定义schemamigration(通过指定--empty 标志)并将app_name_c 中的id 列从id 重命名为a_ptr_id,例如:

    def forwards(self, orm):
        db.rename_column('app_name_c', 'id', 'a_ptr_id')
    

    此时您可以将class C(models.Model) 更改为class C(A),因为基础表现在反映了这一新现实。

    4) 执行最终自定义架构迁移,将“app_name_b”的“a_ptr_id”列重命名为“b_ptr_id”,例如:

    def forwards(self, orm):
        db.rename_column('app_name_b', 'a_ptr_id', 'b_ptr_id')
    

    此时您可以将class B(A) 更改为新的现实class B(C)

    运行迁移,您已经更新了层次结构!

    【讨论】:

    • 只是要指出:您正在使用数据迁移来更改架构。如果您正在更改数据库表结构,那么它们应该是模式迁移,而不是数据迁移。基本上,如果你使用south.db.db.*,那就是架构迁移。
    • @MatthewSchinckel 感谢您指出这一点。我没有意识到您可以通过指定 --empty 标志来进行自定义模式迁移。根据您的反馈,我正在更新答案,以便步骤 3 和 4 是自定义的 schemamigrations
    猜你喜欢
    • 2012-02-23
    • 2011-12-28
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多