【问题标题】:Migrate after removing ForeignKey to third-party model移除 ForeignKey 后迁移到第三方模型
【发布时间】:2012-08-18 04:32:30
【问题描述】:

我正在删除项目中的一些死代码,并且我有机会删除对我们自项目启动以来一直在使用的第三方应用程序的依赖。我们的一个模型在第三方应用程序中有一个模型的 ForeignKey,当我尝试在项目的新实例上应用迁移时遇到了麻烦。

示例模型:

from django.db import models
from thirdparty.models import ThirdPartyModel

class MyModel(models.Model):
    fk = models.ForeignKey(ThirdPartyModel)

South 检测到正在删除MyModel.fk,并且成功创建了迁移。应用迁移并将其回滚也可以。我现在可以从INSTALLED_APPS 中删除thirdparty 并提交更改(新迁移和settings.py)。

当我在另一台机器上克隆存储库时,问题就开始了。 ./manage.py syncdb 按预期运行并创建所有不由 South 管理的表,但 ./manage.py migrate myapp 在为 MyModel 的(早期版本)创建表时失败,因为无法创建 thirdparty_thirdpartymodel 的外键(正如预期的那样,因为 @ 987654330@ 不再在 INSTALLED_APPS 中,因此没有创建任何表)。

是否有处理删除外部依赖项的标准方法?现在是重置我的迁移的合适时机吗?

【问题讨论】:

    标签: django migration django-south


    【解决方案1】:

    这是一个老问题,但它仍然有效,甚至独立于 South,并且也是 Django Migrations 的问题。

    您应该注意将迁移文件分开,以便您可以伪造依赖于不存在的应用程序的迁移(从 INSTALLED_APPS 中删除)。这样,您将通过伪造这些迁移来创建新安装,并在现有安装上实际运行这些迁移。

    当然,如果您有可能重新开始(例如完全重新启动),您可以擦除数据库、删除所有现有迁移文件并简单地创建全新的迁移。所有其他开发人员也必须放弃他们的数据库。

    如果您有现有的生产数据,但仍想从头开始,那么如何传输数据有不同的可能性。 哪种方式最好取决于有多少数据,结构发生了多少变化等:

    • 普通 SQL(手动更改数据库,运行新迁移后,将旧表中的数据转移到新表中并删除表和外键等)
    • fixtures(通过 Django 在旧系统中转储数据并更改 JSON 以适应新结构)
    • 新旧系统的两个并行安装并通过 Django/Python 脚本传输(比普通 SQL 慢,但您可以使用 Django 模型逻辑,以更舒适的方式应用验证检查、转换等)。

    当然,不要在生产环境中执行此操作,而是在其他地方执行此操作,只需应用结果即可。

    【讨论】:

      猜你喜欢
      • 2015-09-12
      • 2012-09-25
      • 2013-01-07
      • 2015-05-06
      • 2021-07-19
      • 2011-09-21
      • 2014-06-07
      • 2019-07-09
      • 1970-01-01
      相关资源
      最近更新 更多