【问题标题】:Django migrations: How to make existing model non-abstract?Django 迁移:如何使现有模型非抽象?
【发布时间】:2015-08-01 15:18:29
【问题描述】:

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

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

  1. 创建模型库
  2. 使用 RunSQL 将数据从派生表复制到基表。
  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,但由于现有行将具有相同的默认值而失败。

那我该怎么办?

【问题讨论】:

    标签: django database-migration


    【解决方案1】:

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

    1. 创建模型库
    2. 使用 RunSQL 将数据从派生表复制到基表。
    3. 向 Derived 添加一个名为 base_ptr 的整数字段,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 中删除所有其他继承的字段

    这样看来是行得通的。

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多