Django 1.7.1:子模型,删除对父模型的所有引用,并使子模型继承祖父

时间:2015-10-05 11:47:56

标签: python django inheritance

我有三个模型,如:

class A(models.Model):
    pass
    # more fields here

class B(A):
    pass
    # more fields here

class C(B):
    pass
    # more fields here

新要求要求我改为:

class A(models.Model):
    pass
    # more fields here

class B(A):
    pass
    # more fields here

class C(A):
    pass
    # more fields here

代码已在生产中运行,因此我需要进行一些数据迁移。认为它会顺利运作,这就是我打算做的事情:

  1. 将每个C的{​​{1}}保存到临时字段。
  2. b_ptr_id删除C的继承(在此过程中删除B)。
  3. b_ptr_id继承自C(在此过程中添加A)。
  4. 对于每个a_ptr_id,将临时字段中存储的值复制到C
  5. 删除临时字段。
  6. 我的问题在于第3步。当我尝试从a_ptr_id创建继承C时,我收到错误A。所以看起来Django仍然“记得”django.core.exceptions.FieldError: Local field 'a_ptr' in class 'C' clashes with field of similar name from base class 'B'曾经从C继承,即使B不再是数据库中b_ptr_id的列< / strong>即可。如何让它忘记,以便我可以继续前进?或者有没有更好的方法让子模型继承祖父模型而不是父模型?

1 个答案:

答案 0 :(得分:2)

不确定是否有更简单的方法可以做到这一点......

尝试创建一个继承A的C'。 然后创建一个程序,创建每个C实例的C'实例。 (之后删除所有C的实例)

如果要保留名称C,请更新C的架构,然后从C'实例重新填充C.

希望它有所帮助。 :)