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

kos*_*r22 9 python django python-3.x django-2.1

我正在尝试将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'
Run Code Online (Sandbox Code Playgroud)

这是因为因为Django 2.x,所以'on_delete'方法是ForeignKey字段的必需项(尝试在带有条目的子表之后添加父表时,获取TypeError:__init __()缺少1个必需的位置参数:'on_delete'

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

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

所以我的问题是,在中修改旧的迁移文件是否安全Django?在这种情况下我该怎么办?

knb*_*nbk 8

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

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

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


Era*_*lpB 8

将您的代码更新为 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))
Run Code Online (Sandbox Code Playgroud)

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

  • 节省了很多时间。谢谢。@EralpB (2认同)