Django 迁移:如何使现有模型非抽象?

Django migrations: How to make existing model non-abstract?

我有两个模型 类 Base 和 Derived(继承自 Base),Base 是抽象的。现在我意识到 Base 应该是具体的。我如何创建迁移来为我进行切换?

我目前的主要问题是派生 table 中需要的 base_ptr_id 列,这是一个主键。必须添加此列并接收指向 table Base 中相应行的正确值。目前我正在做这些迁移操作:

  1. 创建模型基地
  2. 使用 RunSQL 将数据从 Derived table 复制到 Base table。
  3. 将 OneToOneField base_ptr 添加到 Derived with primary_key=False
  4. 使用 RunSQL 将 ID 复制到 base_ptr_id 列
  5. 从 Derived 中删除 id 列
  6. 将 OneToOneField base_ptr 更改为 primary_key
  7. 从 Derived 中删除所有其他继承的字段

目前该过程在第 3 步失败。看起来 Django 仍然创建了一个主键列 base_ptr_id,但它失败了,因为现有行将具有相同的默认值。

那我该怎么办?

更进一步,我想出了以下解决方案:

  1. 创建模型库
  2. 使用 RunSQL 将数据从 Derived table 复制到 Base table。
  3. 将名为 base_ptr 的整数字段添加到 Derived with primary_key=False 和 db_column='base_ptr_id'
  4. 使用 RunSQL 将 ID 复制到 base_ptr_id 列
  5. 从 Derived 中删除 id 列
  6. 将 base_ptr 更改为所需的 OneToOneField,这也意味着是 primary_key
  7. 从 Derived 中删除所有其他继承的字段

这样看来可行。