从1.11迁移到Django 2.2-在ForeignKey中没有on_delete的旧迁移破坏了一切

时间:2019-12-10 05:27:50

标签: django upgrade django-migrations django-2.2

我正在将我的旧应用程序从Django 1.11.13升级到2.2.8。我已经尽职尽责地解决了所有兼容性问题,但是我遇到了一个我不知道如何解决的问题。当我尝试在本地环境中启动Web服务器时,出现此错误(仅显示出现的完整错误跟踪的结尾):

  File "/Users/me/my_app/my_model/migrations/0001_initial.py", line 37, in Migration
    ('entry', models.ForeignKey(to='my_model.Entry')),
TypeError: __init__() missing 1 required positional argument: 'on_delete'

我了解为什么现在需要on_delete -我只是花了一点时间在各处更新我的模型以适应这种变化-但是我不知道如何解决这个特定问题而不需要浏览许多旧的迁移文件使它们符合要求?!

  • 我尝试过squashmigrations至少折叠了我需要清理的地方数量,但我得到了完全相同的TypeError

  • 我尝试将旧版本的Django用于squashmigrations。我成功地避免了TypeError,但最终陷入了巨大的循环导入错误。

  • 由于我实际上不需要回滚迁移历史记录,因此我尝试遵循these instructions (scenario 2) to clear the migration history while keeping the existing database,但是我无法运行makemigrations来赶上我对使我的模型与Django 2.2兼容,当我决定跳过并稍后处理时,showmigrations失败,并出现了相同的TypeError。 (是否还有其他方法可以基于当前数据库获得一组新的初始迁移?它不能基于模型,因为模型的升级相关更改尚未反映在数据库中。)

    < / li>
  • 我将迁移移至非标准位置,从而启动了服务器,但是这使得实际上无法再次进行与迁移相关的任何操作,当然,一旦我移回,一切都会再次中断。 ..

我机智了。我曾考虑过删除整个数据库和所有迁移历史记录,使用一组新的初始迁移从头开始构建表,然后从备份中重置数据,但是有一些巨大的表会使这花费相当多的时间。而...这似乎是核方法。我是否会出于无缘无故地坚持编辑大量非常老的迁移程序以使其与Django 2.2兼容,因为我永远也不会回滚我的项目呢?怎么可能呢?!

...或者我在这里缺少明显的东西?

1 个答案:

答案 0 :(得分:0)

Iain Shelvington在问题下的评论中提到,

  

首先删除所有迁移文件和文件夹,然后使用“ on_delete”运行makemigrations-这将创建一些“初始”迁移文件。然后,您必须登录到数据库并删除应用程序的所有条目,然后需要运行manage.py migrate --fake-这将为新创建的迁移输入数据库条目,但不会应用