如何使用引用外键将Django模型移动到其他应用程序?

时间:2015-03-31 11:34:08

标签: python django django-migrations

这是此问题的扩展:How to move a model between two Django apps (Django 1.7)

我希望使用Django迁移将模型M从应用A移动到应用B,而不会丢失数据。该问题的最佳投票答案(不是已接受的答案,ozan之一)建议使用migrations.SeparateDatabaseAndState并分两步执行:

  1. 迁移以删除模型并重命名(而不是删除)db表。
  2. 迁移以创建新模型并使用现有表格。
  3. 这看起来对我来说是一种非常聪明的方式,但是在我的情况下还有另一个模型N有一个M的外键。现在,当我在第二步调用makemigrations来制作迁移文件时,我收到错误,因为在那个阶段模型AM不再存在:

    ValueError: Lookup failed for model referenced by field C.N.m: A.M  
    

    有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

这就是我最终做到的。主要思想是在删除旧模型之前创建新模型schillingt建议,但也使用migrations.SeparateDatabaseAndState来避免数据库修改,如链接问题中那样。

  1. 将模型从A复制到B.定义db_table以指定相同的表名

  2. 进行B迁移。将迁移文件修改为仅使用 migrations.SeparateDatabaseAndState 创建状态而不是数据库表。

  3. 修改N中的外键以指向B.M而不是A.M(通过to ='B.M')。

  4. 为此更改进行迁移。

  5. 从A。

  6. 删除模型
  7. 进行迁移以进行删​​除。修改它,使其仅删除模型,而不是数据库表。

  8. 应用所有迁移。

  9. 之后仍然可以重命名该表,但是在我使用的1.7版本中,迁移不支持db_table更改。

答案 1 :(得分:0)

这是我将如何处理它。

  1. 在应用B中创建新模型(包括应用A中模型的1:1Key),以及从模型N到应用B模型的迁移和新外键。
  2. 创建迁移以将应用A中旧模型的所有数据复制到应用B中的新模型。
  3. 在模型N上填充新的FK。您将通过使用应用程序A和B中的模型之间的1:1Key来执行此操作。
  4. 更新所有代码和外键以引用应用B中的新模型并运行迁移。
  5. 将FK从N移除到应用A的模型,并从应用A中删除模型。运行迁移将其从数据库中删除。