如何通过引用外键将 Django 模型移动到其他应用程序?
How to move Django model to other app with referencing foreign keys?
这是对这个问题的扩展:How to move a model between two Django apps (Django 1.7)
我想使用 Django 迁移将模型 M 从应用程序 A 移动到应用程序 B 而不会丢失数据。该问题的最佳投票答案(不是接受的答案,ozan 的答案)建议使用 migrations.SeparateDatabaseAndState 并分两步完成:
- 迁移以删除模型并重命名(而不是删除)数据库 table。
- 迁移以创建新模型并为其使用现有 table。
这对我来说看起来是一个非常聪明的方法,但是在我的例子中还有另一个模型 N 具有指向 M 的外键。现在,当我在第二步中调用 makemigrations 来制作迁移文件时,我得到了一个错误,因为在那个阶段模型 A.M 不再存在:
ValueError: Lookup failed for model referenced by field C.N.m: A.M
有办法处理吗?
这是我的处理方式。
- 在应用程序 B 中创建新模型(包括 1:1Key 到应用程序 A 中的模型),并将模型 N 的新外键迁移到应用程序 B 的模型。
- 创建迁移以将所有数据从应用 A 中的旧模型复制到应用 B 中的新模型。
- 在模型 N 上填充新 FK。您将通过在应用程序 A 和 B 中的模型之间使用 1:1Key 来执行此操作。
- 更新所有代码和外键以在应用 B 和 运行 迁移中引用新模型。
- 从 N 中删除 FK 到应用程序 A 的模型,并从应用程序 A 中删除模型。运行 迁移以将它们从数据库中删除。
这就是我最终做到的。主要思想是按照 schillingt 建议在删除旧模型之前创建新模型,但也使用 migrations.SeparateDatabaseAndState 来避免链接问题中的数据库修改。
将模型从A复制到B。定义db_table分配相同的table名称
为 B 进行迁移。修改迁移文件以仅创建状态而不是数据库 table 使用 migrations.SeparateDatabaseAndState.
修改N中的外键指向B.M而不是A.M(via to='B.M').
为此更改进行迁移。
从 A 中删除模型
为删除进行迁移。修改它只删除模型,不删除数据库 table.
应用所有迁移。
之后仍然可以重命名 table,但是在我使用的 1.7 版本中,迁移不支持 db_table 更改。
这是对这个问题的扩展:How to move a model between two Django apps (Django 1.7)
我想使用 Django 迁移将模型 M 从应用程序 A 移动到应用程序 B 而不会丢失数据。该问题的最佳投票答案(不是接受的答案,ozan 的答案)建议使用 migrations.SeparateDatabaseAndState 并分两步完成:
- 迁移以删除模型并重命名(而不是删除)数据库 table。
- 迁移以创建新模型并为其使用现有 table。
这对我来说看起来是一个非常聪明的方法,但是在我的例子中还有另一个模型 N 具有指向 M 的外键。现在,当我在第二步中调用 makemigrations 来制作迁移文件时,我得到了一个错误,因为在那个阶段模型 A.M 不再存在:
ValueError: Lookup failed for model referenced by field C.N.m: A.M
有办法处理吗?
这是我的处理方式。
- 在应用程序 B 中创建新模型(包括 1:1Key 到应用程序 A 中的模型),并将模型 N 的新外键迁移到应用程序 B 的模型。
- 创建迁移以将所有数据从应用 A 中的旧模型复制到应用 B 中的新模型。
- 在模型 N 上填充新 FK。您将通过在应用程序 A 和 B 中的模型之间使用 1:1Key 来执行此操作。
- 更新所有代码和外键以在应用 B 和 运行 迁移中引用新模型。
- 从 N 中删除 FK 到应用程序 A 的模型,并从应用程序 A 中删除模型。运行 迁移以将它们从数据库中删除。
这就是我最终做到的。主要思想是按照 schillingt 建议在删除旧模型之前创建新模型,但也使用 migrations.SeparateDatabaseAndState 来避免链接问题中的数据库修改。
将模型从A复制到B。定义db_table分配相同的table名称
为 B 进行迁移。修改迁移文件以仅创建状态而不是数据库 table 使用 migrations.SeparateDatabaseAndState.
修改N中的外键指向B.M而不是A.M(via to='B.M').
为此更改进行迁移。
从 A 中删除模型
为删除进行迁移。修改它只删除模型,不删除数据库 table.
应用所有迁移。
之后仍然可以重命名 table,但是在我使用的 1.7 版本中,迁移不支持 db_table 更改。