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

2023-12-13

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

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

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


Since django-2.0 ForeignKey字段 [Django 文档] and OneToOneField字段 字段现在有一个必需的on_delete范围.

这是在Django-2.0 的发行说明如下2.0 中删除的功能:

The on_delete争论 for ForeignKey and OneToOneField is 现在需要在模型和迁移中。考虑挤压迁移这样你就可以减少它们的数量更新.

因此,您应该检查您的迁移文件ForeignKeys and 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')),
            ],
        ),
    ]

您应该检查文档关于on_delete范围查看最适合每种情况的删除策略。在撰写本文时,选项是CASCADE, PROTECT, SET_NULL, SET_DEFAULT, SET(..), DO_NOTHING.

如果您没有指定on_delete在预django-2.0版本,它默认为CASCADE。因此,如果您想要相同的行为,您应该添加on_delete=models.CASCADE。这在1.11版本的文档on_delete:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐