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

Posted

技术标签:

【中文标题】如何通过引用外键将 Django 模型移动到其他应用程序?【英文标题】:How to move Django model to other app with referencing foreign keys? 【发布时间】:2015-06-04 17:39:21 【问题描述】:

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

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

    迁移以删除模型并重命名(而不是删除)数据库表。 迁移以创建新模型并为其使用现有表。

这对我来说似乎是一个非常聪明的方法,但是在我的情况下,还有另一个模型 N 具有 M 的外键。现在,当我在第二步中调用 makemigrations 来制作迁移文件时,我收到一个错误,因为在那个阶段,模型 AM 已不存在:

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

有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

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

    将模型从 A 复制到 B。定义 db_table 以分配相同的表名

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

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

    针对此更改进行迁移。

    从 A 中删除模型。

    为删除进行迁移。修改它,使其只删除模型,而不是数据库表。

    应用所有迁移。

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

【讨论】:

【参考方案2】:

这就是我的处理方式。

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

【讨论】:

如何通过迁移复制数据? 有数据迁移。 docs.djangoproject.com/en/1.7/topics/migrations/…

以上是关于如何通过引用外键将 Django 模型移动到其他应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 1.7 中通过外键将 created_by 和 updated_by 用户添加到 model.py? [复制]

Django模型:如何避免在使用来自同一个表的2个外键时引用相同的记录

如何清理 Django 孤儿外键值?

如何在 Django 中支持使用多封电子邮件的用户?

如何在Django的同一个表中阻止外键的相同对象引用?

Django 外键关系应该是用户到模型还是模型到用户?