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



我正在努力思考如何做到这一点:我很想看到以前做过这件事的人的例子!

假设,之前:

class A(models.Model):
pass
class B(A)
pass

我想了解的情况是:

class A(models.Model):
pass
class C(A):
pass
class B(C):
pass

我该怎么写《南迁记》呢?我需要进行"数据迁移"吗?

以下是我最终解决问题的方法(这是一个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_prtr_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)

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

最新更新