在 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.x
,ForeignKey
字段需要'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 个正则表达式来更新带有搜索和替换功能的代码库。当然,通过检查每个替换来跳过,但是使用正则表达式可以节省您的时间。
我正在尝试将我的 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
,ForeignKey
字段需要'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 个正则表达式来更新带有搜索和替换功能的代码库。当然,通过检查每个替换来跳过,但是使用正则表达式可以节省您的时间。