挣扎着围绕如何实现这个目标:我很想看到之前完成它的人的一个例子!
假设,之前:
class A(models.Model):
pass
class B(A)
pass
我想要的情况是:
class A(models.Model):
pass
class C(A):
pass
class B(C):
pass
我将如何为此编写南迁?我是否需要进行“数据迁移”?
答案 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)
的新现实。
运行迁移,您已更新层次结构!