将 Django 项目移植到 Python 3 和 Django 2 时的迁移问题

Tay*_*lor 3 python django django-2.0

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

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

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

Wil*_*sem 5

由于 ForeignKey字段 [Django-doc]OneToOneFieldfields 字段现在有一个必需的on_delete参数

这在Django-2.0发行说明中在 2.0 中删除的功能指定:

on_delete参数用于ForeignKeyOneToOneField现在需要在模型和迁移。考虑压缩迁移,以便更新更少的迁移

因此,您应该检查迁移文件中的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')),
            ],
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

您应该检查有关on_delete参数文档,以了解哪种删除策略最适合每种情况。选项是,在写作的时候CASCADEPROTECTSET_NULLSET_DEFAULTSET(..)DO_NOTHING

如果您没有on_delete版本中指定 ,则默认为CASCADE。所以如果你想要相同的行为,你应该添加on_delete=models.CASCADE. 这在1.11 版本的文档中on_delete注明:

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