【问题标题】:Migrating problems when porting Django project to Python 3 and Django 2将 Django 项目移植到 Python 3 和 Django 2 时的迁移问题
【发布时间】:2019-11-26 19:13:43
【问题描述】:

我一直在将一个 Django 项目移植到 Python 3 和 Django 2。我必须按照 Django 2 的要求将 on_delete 添加到我的所有具有外键的模型中。现在我已经尝试对这些更改进行迁移TypeError: __init__() missing 1 required positional argument: 'on_delete'.

它引用的文件是 0002 迁移文件,而不是已更新的模型文件。我不知道如何解决这个问题。我尝试伪造迁移,但仍然遇到同样的错误。

我不确定为什么它认为数据库不存在,我已经检查过,一切都完好无损并且在 Postgres 中工作。有什么想法吗?

【问题讨论】:

  • 是的,ForeignKeyOneToOneField 上的 on_delete= 字段现在是必需的。您应该修复迁移文件。
  • 这不是进行迁移以便将它们添加到迁移中的目的吗?如果我将它们添加到以前运行的迁移文件(例如 0002)中,那将如何工作?
  • 但是你说你升级了 Django 版本。因此,现在您让 Django-2.0 框架解释由 Django-1.x 框架编写的代码。 Django 不是 100% 向后兼容的。发行说明中列出了例外情况。在以前的 Django 版本中,这些不是必需的。
  • 我确实升级了版本,并且我还在我的 models.py 中添加了必要的字段。如果我错了,请纠正我,但据我了解 1)它应该忽略 0002 文件,因为它已经运行过;2)当我更新 models.py 文件时,迁移应该进行相应的更改,以便记录下来供其他人使用.
  • 不会每次都解释迁移文件。由于迁移文件调用ForeignKey 构造函数,它会出错。您已经应用它们的事实是无关紧要的。由于 Django 将解释这些以创建一个 有向无环图,它将拓扑排序以运行可能尚未运行的迁移。

标签: python django django-2.0


【解决方案1】:

由于 ForeignKey fields [Django-doc]OneToOneField fields fields 现在有一个必需的on_delete parameter

这是在release notes of Django-2.0 under Features removed in 2.0中指定的:

ForeignKeyOneToOneFieldon_delete 参数在模型和迁移中现在是必需的。考虑压缩迁移,以减少要更新的迁移

因此,您应该检查您的迁移文件中的ForeignKeys 和OneToOneFields,并添加一个on_delete 参数,例如:

class Migration(migrations.Migration):

    initial = False

    dependencies = [
        ('app', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='Model',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('some_foreignkey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.OtherModel')),
            ],
        ),
    ]

您应该检查documentation on the on_delete parameter 以了解哪种删除策略最适合每种情况。在撰写本文时,选项为CASCADEPROTECTSET_NULLSET_DEFAULTSET(..)DO_NOTHING

如果您未在 之前的版本中指定on_delete,则默认为CASCADE。所以如果你想要同样的行为,你应该添加on_delete=models.CASCADE。这在1.11 version of the documentation on on_delete 中注明:

自 1.9 版起已弃用:on_delete 将成为 Django 2.0 中的必需参数。在旧版本中,它默认为CASCADE

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2011-10-26
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多