这就是我最终解决问题的方法(这是一个 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)。
运行迁移,您已经更新了层次结构!