Django 1.8模型迁移依赖于过时的字段类型

时间:2016-01-15 08:20:48

标签: python django django-models database-migration

我在Django 1.8项目的模型中使用了来自第三方包的特定类型的字段:

class MyModel(models.Model):  
    image = third_party_package.SpecificImageField(...)

然后我将字段类型更改为标准Django类型:

class MyModel(models.Model):  
    image = models.ImageField(...)

数据库已成功迁移到新版本的模型:

./manage.py makemigrations
./manage.py migrate

然后我删除了第三方软件包,因为我不再需要它了。

问题是迁移仍然依赖于第三方软件包。 Makemigrations命令找不到第三方包并失败。 作为解决方法,我可以安装第三方软件包并迁移数据库,但是如何在不丢失数据的情况下删除对第三方软件包的依赖?

2 个答案:

答案 0 :(得分:4)

我没有对此进行过测试,但我想象你能够squash your migrations能够合并它们。

manage.py squashmigrations myapp 0050

您需要将要压缩的应用名称以及要挤压的迁移次数传递给它。

这样做是将您的迁移文件合并到一个" super"迁移文件,其中包含这些迁移中的所有更改,同时删除那些冲突的更改。

  

压缩是将现有的一系列迁移减少到一个(有时是几个)迁移的行为,这些迁移仍然代表相同的变化。

     

Django通过获取所有现有迁移,提取其操作并将它们全部按顺序执行,然后对它们运行优化器来尝试减少列表的长度来实现这一点 - 例如,它知道CreateModel和DeleteModel取消彼此,它知道AddField可以滚动到CreateModel。

答案 1 :(得分:1)

由于字段类型仅在软件级别上,您可以按照以下方式进行操作(一种特技):只需在您的迁移脚本中使用third_party_package.SpecificImageField(...)更改models.ImageField(...) 。它将完美地工作,因为它不会在数据库级别进行任何更改,否则您将不得不手动优化迁移脚本,直到获得依赖关系。