我正在努力思考如何做到这一点:我很想看到以前做过这件事的人的例子!
假设,之前:
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)
。
运行迁移,您已经更新了层次结构!