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

问题描述 投票:0回答:1

我正在将旧版应用程序从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。 (是否还有其他方法可以基于当前数据库获得一组新的初始迁移?它不能基于模型,因为模型的升级相关更改尚未反映在数据库中。)

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

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

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

django upgrade django-migrations django-2.2
1个回答
0
投票

您可以做的最好的事情是,“手动”编辑迁移文件],然后将on_delete设置为所需的值。

示例

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        ...,
        migrations.AddField(
            model_name='your_model_name',
            name='field_name',
            field=models.ForeignKey(to='app_name.FKModelName', on_delete=models.CASCADE),
        ),
    ]
© www.soinside.com 2019 - 2024. All rights reserved.