【问题标题】:Django 1.8 model migrations have dependency to outdated field typeDjango 1.8 模型迁移依赖于过时的字段类型
【发布时间】:2016-04-20 19:07:57
【问题描述】:

我在 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 命令找不到第三方包并失败。 作为解决方法,我可以重新安装第三方包并迁移数据库,但是如何在不丢失数据的情况下删除对第三方包的依赖?

【问题讨论】:

    标签: python django django-models database-migration


    【解决方案1】:

    我尚未对此进行测试,但我想您可以将 squash your migrations 合并在一起。

    manage.py squashmigrations myapp 0050
    

    您需要将要压缩的应用的名称以及要压缩到的迁移数量传递给此参数。

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

    压缩是将一组现有的许多迁移减少到一个(或有时是几个)迁移仍然代表相同更改的行为。

    Django 通过获取所有现有迁移,提取它们的操作并将它们全部按顺序排列,然后对它们运行优化器以尝试减少列表的长度,例如,它知道 CreateModel 和 DeleteModel互相抵消,就知道AddField可以滚入CreateModel。

    【讨论】:

    • 我试过 squashmigrations 命令,但没有帮助。 “超级”迁移仍然依赖于第三方包。但也许我只是用错了....
    • @Sandro - 我不确定它是否仍会包含它,(这不是我可以轻松测试的东西),也许可以剖析它自己创建的迁移并手动编辑它以查看是否可以获得所需的结果。我不确定有更好的方法
    • @Sandro - 为了扩展我上面的评论,我猜它创建的迁移涉及 CreateFieldAlterField 操作,可能值得尝试将它们修改为单个 CreateField ,小心点
    【解决方案2】:

    由于字段类型仅在软件级别,您可以进行以下操作(一种技巧):只需在您的迁移脚本中将third_party_package.SpecificImageField(...) 更改为models.ImageField(...)。它将完美运行,因为它不会在数据库级别更改任何内容,否则您将不得不手动优化迁移脚本直到摆脱依赖。

    【讨论】:

    • 它有效。编辑迁移脚本后,它开始正常工作。但我认为这个解决方案有点像黑客......也许还有其他更干净的方法来做到这一点......
    • 即使迁移依赖于外部应用程序中的方法,Django 迁移也不会自动处理这种依赖关系,您应该在迁移脚本中重新实现该方法,以防您将其从应用程序。事实上,Django 提供了手动更新迁移以解决此类冲突的可能性。我会向您推荐这个article,以便更好地了解它是如何工作的,并且手动解决冲突并没有什么不好。
    • @Sandro 因为它对您有用,请接受答案,以便读者知道这是一个可能的工作答案。
    • DhiaTN,如果操作人员不认为这是他们问题的正确答案,那么不接受其中任何一个都是完全可以的。据我所知,只有当您确切知道字段的 database 类型是什么时,您的答案才会起作用。使用第三方软件包并不总是那么容易解决
    • 好的,我明白了。但只是为了让我的想法清楚,实际上它不依赖于字段类型,因为它不再存在于数据库中,它只是为迁移脚本提供一种方法,使其在没有第三方依赖项的情况下工作,即使他有用整数字段替换该字段,它会起作用。我相信 squashmigrations 也可以解决问题,但即使在 squashmigrations 的情况下,有时您也需要手动应用一些修改以满足您的需求,因为 django 迁移并非旨在考虑这种情况。
    猜你喜欢
    • 2016-02-10
    • 2019-03-11
    • 2012-03-23
    • 2018-01-31
    • 2015-06-28
    • 2015-10-12
    • 2019-02-16
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多