用于在层次结构中插入模型的示例南模式迁移

时间:2014-01-31 10:49:27

标签: django django-south

挣扎着围绕如何实现这个目标:我很想看到之前完成它的人的一个例子!

假设,之前:

class A(models.Model):
    pass

class B(A)
    pass

我想要的情况是:

class A(models.Model):
    pass

class C(A):
    pass

class B(C):
    pass

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

1 个答案:

答案 0 :(得分:0)

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

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

class C(models.Model):
    pass

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

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

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

3)现在执行自定义schemamigration(通过指定--empty标记)并将id中的app_name_c列从id重命名为{{1}例如:

a_ptr_id

此时您可以将def forwards(self, orm): db.rename_column('app_name_c', 'id', 'a_ptr_id') 更改为class C(models.Model),因为基础表现在反映了这一新现实。

4)执行最终自定义模式移植,将'app_name_b'的'a_ptr_id'列重命名为'b_ptr_id',例如:

class C(A)

此时,您可以将def forwards(self, orm): db.rename_column('app_name_b', 'a_ptr_id', 'b_ptr_id') 更改为class B(A)的新现实。

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