我在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命令找不到第三方包并失败。 作为解决方法,我可以安装第三方软件包并迁移数据库,但是如何在不丢失数据的情况下删除对第三方软件包的依赖?
答案 0 :(得分:4)
我没有对此进行过测试,但我想象你能够squash your migrations能够合并它们。
manage.py squashmigrations myapp 0050
您需要将要压缩的应用名称以及要挤压的迁移次数传递给它。
这样做是将您的迁移文件合并到一个" super"迁移文件,其中包含这些迁移中的所有更改,同时删除那些冲突的更改。
压缩是将现有的一系列迁移减少到一个(有时是几个)迁移的行为,这些迁移仍然代表相同的变化。
Django通过获取所有现有迁移,提取其操作并将它们全部按顺序执行,然后对它们运行优化器来尝试减少列表的长度来实现这一点 - 例如,它知道CreateModel和DeleteModel取消彼此,它知道AddField可以滚动到CreateModel。
答案 1 :(得分:1)
由于字段类型仅在软件级别上,您可以按照以下方式进行操作(一种特技):只需在您的迁移脚本中使用third_party_package.SpecificImageField(...)
更改models.ImageField(...)
。它将完美地工作,因为它不会在数据库级别进行任何更改,否则您将不得不手动优化迁移脚本,直到获得依赖关系。