我正在尝试将我的Django
项目从Python 2.7/Django 1.11
迁移到Python 3.7/Django 2.1
。
我有点困惑。
Django 2.1
将项目中所有models.ForeignKey(...)
代码字符串的错误标记为:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
这是因为自Django 2.x
以来,'on_delete'
字段需要ForeignKey
方法
(Getting TypeError: __init__() missing 1 required positional argument: 'on_delete' when trying to add parent table after child table with entries)
如果您将阅读这篇文章,则解决方案非常简单,您只需添加'on_delete'
选项之一,例如:
models.ForeignKey(..., on_delete=models.CASCADE,)
但是Django
不仅抱怨实际的'models.py'
文件,而且抱怨所有(!)迁移,其中包括添加或更改的"ForeignKey"
字段。
所以我的问题是,在Django
中修改旧的迁移文件是否安全?在这种情况下我该怎么办?
答案 0 :(得分:5)
要将代码更新为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个正则表达式来使用搜索和替换功能更新代码库。当然,通过检查每个替换来解决问题,但是使用正则表达式可以节省您的时间。
答案 1 :(得分:4)
是的,这是1.9 release notes中描述的预期升级路径:
为了提高对级联模型删除的认识,Django 2.0中将需要ForeignKey和OneToOneField的on_delete参数。
更新模型和现有迁移,以显式设置参数。由于默认值为models.CASCADE,请将on_delete = models.CASCADE添加到所有不使用其他选项的ForeignKey和OneToOneFields中。如果您不关心与旧版Django的兼容性,也可以将其作为第二个位置参数传递。