2012-08-22 32 views
2

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

一个示例模型:

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

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

MyModel.fk卸下由南检测,并成功地创建了迁移。应用迁移并回滚它也可以。我现在可以从INSTALLED_APPS中删除thirdparty并提交更改(新迁移和settings.py)。

当我克隆另一台机器上的存储库时,麻烦就开始了。 ./manage.py syncdb运行正常,并创建不是由南方管理的所有表,但创建表(早期版本)MyModel时,因为外键thirdparty_thirdpartymodel不能创建(如预期,因为thirdparty不再INSTALLED_APPS所以没有的./manage.py migrate myapp失败表格被创建)。

是否有标准的方法来处理消除外部依赖?这是重置我的迁移的适当时机吗?

回答

0

这是一个古老的问题,但它仍然有效,甚至独立于南方,也是Django迁移的一个问题。

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

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

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

  • 普通的SQL(手动更改数据库,运行新的迁移,从旧表中的数据转移到后新和丢表和外键等)
  • 固定装置(在旧系统中通过Django转储数据并更改JSON以适应新结构)
  • 两个并行安装的旧系统和新系统通过Django/Python脚本(比普通SQL慢),但是你可以使用Django Model逻辑,以更舒适的方式应用验证检查,转换等)。

当然,不要在生产中这样做,而是在别的地方,只需应用结果。