Django迁移拒绝确认不再从旧父级继承的模型

Django迁移拒绝确认不再从旧父级继承的模型,django,django-migrations,Django,Django Migrations,我试图删除一个具体的父模型,并将它的一些字段直接复制到子模型上。在使用South之前,我已经执行过几次类似的过程(在其他子系统上使用相同的父模型),但是自从升级到Django 1.7之后,它就不再玩游戏了。Django在迁移过程中出现以下错误: FieldError: Local field <field_name> in class <child_model> clashes with field of similar name from base class <

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

FieldError: Local field <field_name> in class <child_model> clashes with field of similar name from base class <parent_model>
FieldError:类中的本地字段与基类中类似名称的字段冲突
当运行
makemigrations
migrate
并发生此错误时,父模型不再作为类的父模型出现在代码中,但迁移仍会发出抱怨

类似的问题和公认的解决方案包括创建新模型、将数据复制到模型、替换现有模型以及将数据复制回来。不幸的是,这种方法在我的情况下不起作用。它是一个已建立的模型,有许多外键指向它,如果原始记录被删除,这些外键将丢失

我在South项目下使用的(简化)方法是:

  • 删除作为父项的模型,并将新字段添加到子项
  • 添加一个与旧自动
    *\u ptr\u id
    字段同名的显式主键字段
  • 运行
    schemamigration
    并将文件编辑为:

    • Remove South尝试删除并重新创建
      *\u ptr
      字段
    • 添加一些自定义逻辑以删除
      *\u ptr\u id
      字段的外键性,并添加PrimaryKey属性
  • 使用
    datamigration
    从旧的父项中获取值,并将它们添加到子项的新字段中
  • 我希望这种方法可以很容易地适应本地Django迁移,我(通过一些调整)得到了
    *\u ptr\u id
    字段替换逻辑。但是Django不允许我添加新字段。我尝试了以下方法:

    • 删除父模型并执行自定义的替换、迁移和添加字段作为第二次迁移
    • 删除父模型,不编辑文件以手动处理
      *\u ptr\u id
      ,但保留Django的删除/添加操作,并使用
      --false
      进行迁移
    在这两种情况下,稍后的迁移会添加与旧父级上的字段同名的新字段,从而导致上述错误。Django拒绝承认旧的父模型不再是类的父模型

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

    编辑:


    这似乎是由于列出父模型的
    CreateModel
    schema操作类的
    base
    参数以及缺少更新列表的匹配操作造成的。将此参数列为可选参数,但在以前应用的迁移中手动更改此值是否有任何副作用?

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

    我不确定主键更改是否与解决方案相关,我只是列出变量

    对于对模型名称(和数据)投入较少的人,另一个选项是:删除父对象时重命名模型名称。请注意,虽然这对我有效,但在另一次迁移中切换回原始模型名称会遇到相同的“一次为子,始终为子”错误,因此您仍然需要编辑迁移中的“base=”行


    感谢oogles和社区

    是的,在找不到其他选择并且在这里没有得到任何回应之后,我也最终编辑了这一行。从那以后我就没有注意到任何不良反应。由于我忘了回来回答这个问题,先生,你刚刚为自己赢得了一个被接受的答案;)。