苦苦思索如何做到这一点:我很想看看以前做过这件事的人的例子!
假设在此之前:
class A(models.Model):
pass
class B(A)
pass我想要达到的情况是:
class A(models.Model):
pass
class C(A):
pass
class B(C):
pass我该如何写这篇南迁呢?我需要做一个“数据迁移”吗?
发布于 2014-01-31 20:51:16
下面是我最终如何解决这个问题(这是一个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)。
运行迁移,您已经更新了层次结构!
https://stackoverflow.com/questions/21478179
复制相似问题