首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于在层次结构中插入模型的南模式迁移示例

用于在层次结构中插入模型的南模式迁移示例
EN

Stack Overflow用户
提问于 2014-01-31 18:49:27
回答 1查看 148关注 0票数 0

苦苦思索如何做到这一点:我很想看看以前做过这件事的人的例子!

假设在此之前:

代码语言:javascript
复制
class A(models.Model):
    pass

class B(A)
    pass

我想要达到的情况是:

代码语言:javascript
复制
class A(models.Model):
    pass

class C(A):
    pass

class B(C):
    pass

我该如何写这篇南迁呢?我需要做一个“数据迁移”吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-31 20:51:16

下面是我最终如何解决这个问题(这是一个4步的过程)。仍然有兴趣看看这是否可以改进/简化。

1)将新模型创建为独立模型,例如:

代码语言:javascript
复制
class C(models.Model):
    pass

然后执行自动模式迁移(例如:schemamigration app_name --auto)

2)使用自定义数据迁移使用来自class A的数据填充新模型C。例如,运行datamigration app_name populate_C以创建迁移框架,并使用来自A的现有id填充新模型的id

代码语言:javascript
复制
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,例如:

代码语言:javascript
复制
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',例如:

代码语言:javascript
复制
def forwards(self, orm):
    db.rename_column('app_name_b', 'a_ptr_id', 'b_ptr_id')

此时,您可以将class B(A)更改为新的现实,即class B(C)

运行迁移,您已经更新了层次结构!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21478179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档