在Django中修改旧的迁移文件是否正确?

时间:2018-08-20 14:58:12

标签: python django python-3.x django-2.1

我正在尝试将我的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中修改旧的迁移文件是否安全?在这种情况下我该怎么办?

2 个答案:

答案 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的兼容性,也可以将其作为第二个位置参数传递。