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

Is it correct to modify old migration files in Django?

我正在尝试将我的 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.xForeignKey字段需要'on_delete'方法 ()

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

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

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

是的,这是 1.9 release notes 中描述的预期升级路径:

In order to increase awareness about cascading model deletion, the on_delete argument of ForeignKey and OneToOneField will be required in Django 2.0.

Update models and existing migrations to explicitly set the argument. Since the default is models.CASCADE, add on_delete=models.CASCADE to all ForeignKey and OneToOneFields that don’t use a different option. You can also pass it as the second positional argument if you don’t care about compatibility with older versions of Django.

将您的代码更新到 Django 2

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

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

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

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