我有两个模型类 Base 和 Derived (继承自 Base),并且 Base 是抽象的。现在我意识到基础应该是具体的。如何创建为我进行切换的迁移?
目前对我来说主要问题是派生表中需要的base_ptr_id列,这是一个主键。必须添加此列并接收指向 Base 表中相应行的正确值。目前我正在做这些迁移操作:
- 创建模型库
- 使用 RunSQL 将数据从派生表复制到基表。
- 使用primary_key=False 将 OneToOneField base_ptr 添加到 Derived
- 使用 RunSQL 将 id 复制到 base_ptr_id 列
- 从派生中删除 id 列
- 将 OneToOneField base_ptr 更改为主键
- 从 Derived 中删除所有其他继承的字段
目前,该过程在第 3 步失败。看起来 Django 仍然创建了一个主键列 base_ptr_id,但它失败了,因为现有行将具有相同的默认值。
那我能做什么呢?
最佳答案
进一步我想出了以下解决方案:
- 创建模型库
- 使用 RunSQL 将数据从派生表复制到基表。
- 使用primary_key=False 和db_column='base_ptr_id' 将名为base_ptr 的整型字段添加到Derived
- 使用 RunSQL 将 id 复制到 base_ptr_id 列
- 从派生中删除 id 列
- 将base_ptr更改为所需的OneToOneField,这也意味着是primary_key
- 从 Derived 中删除所有其他继承的字段
这样看来是可行的。
关于Django 迁移 : How to make existing model non-abstract?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348608/