Django 迁移 : How to make existing model non-abstract?

标签 django database-migration

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

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

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

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

那我能做什么呢?

最佳答案

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

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

这样看来是可行的。

关于Django 迁移 : How to make existing model non-abstract?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348608/

相关文章:

python - 方法对象不是 JSON 可序列化的

python - 根目录下的 Django requirements.txt 文件

sql-server - 在 T-SQL 中划分日期值

android - 如何在一个应用程序中处理 SQLiteOpenHelper 和 RoomDatabase?

ruby-on-rails - 从数据映射器中的 PostgreSQL 二进制列中删除限制

ruby-on-rails - 迁移运行时在 db/structure.sql 上删除了 Postgresql 扩展

android - 具有唯一索引的房间数据库迁移问题

django - 编辑 Django 用户管理模板

Django 模型 : many-to-many or many-to-one?

Django 在尝试保存对象属性时抛出 "invalid literal for int() with base 10: ' '"