Django 用于在层次结构中插入模型的模式迁移示例
绞尽脑汁想知道如何做到这一点:我很想看看以前做过这件事的人的例子 假设,在:Django 用于在层次结构中插入模型的模式迁移示例,django,django-south,Django,Django South,绞尽脑汁想知道如何做到这一点:我很想看看以前做过这件事的人的例子 假设,在: 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 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\u name--auto
)
2) 使用自定义数据迁移,使用class A
中的数据填充新模型C
。例如运行datamigration app\u name populate\u 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')
此时,您可以将类C(models.Model)
更改为类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')
在这一点上,您可以将B类(A)
更改为新的现实,即B类(C)
运行迁移,您已经更新了层次结构 只需指出:您正在使用数据迁移进行模式更改。如果您正在更改数据库表结构,那么它们应该是架构迁移,而不是数据迁移。基本上,如果您使用的是
south.db.db.*
,这是一种模式迁移。@MatthewSchinckel感谢您指出这一点。我不知道您可以通过指定--empty
标志来进行自定义模式迁移。根据您的反馈,我正在更新答案,以便第3步和第4步是定制的schemamigration