Django 迁移拒绝承认模型不再继承自旧 parent

Django migrations refuse to acknowledge a model no longer inherits from old parent

我正在尝试删除一个具体的 parent 模型并将它的一些字段直接复制到 child 上。在使用 South 之前,我已经执行过几次类似的过程(在其他 children 上使用相同的 parent 模型),但是自从升级到 Django 1.7 后,它就是不玩游戏了。 Django 在 migrate 过程中给出以下错误:

FieldError: Local field <field_name> in class <child_model> clashes with field of similar name from base class <parent_model>

makemigrationsmigrate 都是 运行 并且出现此错误的时候,parent 模型不再作为 parent 的 class,但迁移仍然有问题。

一个类似的问题 和接受的解决方案涉及创建一个新模型、将数据复制到它、替换现有模型,然后将数据复制回来。不幸的是,这种方法不适用于我的情况。它是一个建立的模型,有许多外键指向它,如果删除原始记录,它将丢失。

我在南方使用的(简化)方法是:

  1. 删除模型作为 parent 并将新字段添加到 child
  2. 添加一个与旧自动 *_ptr_id 字段同名的显式主键字段
  3. 运行 schemamigration 并将文件编辑为:

    • 移除 South 移除并重新创建 *_ptr 字段的尝试
    • 添加一些自定义逻辑以删除 *_ptr_id 字段的 ForeignKey-ness 并添加 PrimaryKey-ness
  4. 使用 datamigration 从旧的 parent 中获取值并将它们添加到 child
  5. 的新字段中

这是我希望能够相当容易地适应本机 Django 迁移的方法,并且我得到了(通过一些调整)*_ptr_id 字段替换逻辑。但是 Django 不允许我添加新字段。我尝试了以下方法:

在这两种情况下,稍后的迁移会添加与旧 parent 上的字段同名的新字段,从而导致上述错误。 Django 拒绝承认旧的 parent 模型不再是 class.

的 parent

有没有其他人遇到过这个问题并且能够解决它?

编辑:

这似乎是由于列出 parent 模型的 CreateModel 模式操作 class 的 bases 参数以及缺少要更新的匹配操作引起的名单。 documentation for CreateModel 将此参数列为可选参数,但是是否有任何 side-effects 可以在先前应用的迁移中手动更改此值?

在 Django 1.11 中遇到同样的问题后,我按照编辑后的建议在我的迁移文件中找到了初始 'CreateModel' 调用。注释掉 bases=('{appname}.{modelname}',), 行并将我的模型的主键明确设置为 'id' 然后重新 运行 makemigrationsmigrate 为我解决了这个问题。

我不确定主键更改是否与解决方案相关,我只是在布置变量。

对模型名称(和数据)投资较少的人的另一种选择:删除父项时重命名。请注意,虽然这对我有用,但在另一个迁移中切换回原始模型名称会遇到同样的 "once a child, always a child" 错误,因此您仍然需要在迁移中编辑 'bases=' 行。

感谢 oogles 和社区!