16

我正在尝试将我的Django项目Python 2.7/Django 1.11Python 3.7/Django 2.1.

我对一个问题有点困惑。

Django 2.1models.ForeignKey(...)将我项目中的所有代码字符串标记为错误:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

这是因为Django 2.x,字段'on_delete'需要方法( Getting TypeError: __init__() missing 1 required positional argument: 'on_delete' when trying to add parent table after child table with entriesForeignKey

如果您阅读这篇文章,解决方案非常简单,您只需添加一个'on_delete'选项,例如: models.ForeignKey(..., on_delete=models.CASCADE,)

Django不仅抱怨实际'models.py'文件,而且抱怨所有(!)包括"ForeignKey"字段添加或更改的迁移。

所以我的问题是,修改旧的迁移文件是否安全Django?这是我在这种情况下应该做的吗?

4

2 回答 2

19

是的,这是1.9 发行说明中描述的预期升级路径:

为了提高对级联模型删除的认识,Django 2.0 中将需要 ForeignKey 和 OneToOneField 的 on_delete 参数。

更新模型和现有迁移以显式设置参数。由于默认值为 models.CASCADE,因此将 on_delete=models.CASCADE 添加到所有不使用不同选项的 ForeignKey 和 OneToOneFields。如果您不关心与旧版本 Django 的兼容性,也可以将其作为第二个位置参数传递。

于 2018-08-20T15:08:05.673 回答
9

将您的代码更新为 Django 2

(.*)models.ForeignKey\((((?!on_delete).)*)\)\)
$1models.ForeignKey($2, on_delete=models.CASCADE))

field=models.ForeignKey\((((?!on_delete).)*)\)
field=models.ForeignKey($1, on_delete=models.CASCADE)

(.*)models.OneToOneField\((((?!on_delete).)*)\)\)
$1models.OneToOneField($2, on_delete=models.CASCADE))

您可以使用这 3 个正则表达式通过搜索和替换功能更新您的代码库。当然,通过检查每个替换来跳过,但是使用正则表达式可以节省您的时间。

于 2020-05-18T17:19:52.693 回答