Django迁移拒绝确认不再从旧父级继承的模型
我试图删除一个具体的父模型,并将它的一些字段直接复制到子模型上。在使用South之前,我已经执行过几次类似的过程(在其他子系统上使用相同的父模型),但是自从升级到Django 1.7之后,它就不再玩游戏了。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 <
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
- 添加一些自定义逻辑以删除
字段的外键性,并添加PrimaryKey属性*\u ptr\u id
datamigration
从旧的父项中获取值,并将它们添加到子项的新字段中*\u ptr\u id
字段替换逻辑。但是Django不允许我添加新字段。我尝试了以下方法:
- 删除父模型并执行自定义的替换、迁移和添加字段作为第二次迁移
- 删除父模型,不编辑文件以手动处理
,但保留Django的删除/添加操作,并使用*\u ptr\u id
进行迁移--false
这似乎是由于列出父模型的
CreateModel
schema操作类的base
参数以及缺少更新列表的匹配操作造成的。将此参数列为可选参数,但在以前应用的迁移中手动更改此值是否有任何副作用?在Django 1.11中遇到同样的问题后,我按照编辑后的建议,在迁移文件中找到了初始的“CreateModel”调用。注释掉base=('{appname}.{modelname}',),
行,并显式地将我的模型的主键设置为'id',然后重新运行makemigrations
和migrate
为我解决了这个问题
我不确定主键更改是否与解决方案相关,我只是列出变量
对于对模型名称(和数据)投入较少的人,另一个选项是:删除父对象时重命名模型名称。请注意,虽然这对我有效,但在另一次迁移中切换回原始模型名称会遇到相同的“一次为子,始终为子”错误,因此您仍然需要编辑迁移中的“base=”行
感谢oogles和社区 是的,在找不到其他选择并且在这里没有得到任何回应之后,我也最终编辑了这一行。从那以后我就没有注意到任何不良反应。由于我忘了回来回答这个问题,先生,你刚刚为自己赢得了一个被接受的答案;)。