如果我有一个非空的模型字段,将其删除并创建一个迁移,那么该迁移将变为不可逆:
考虑以下模型:
考虑以下模型:
class Foo(models.Model):
bar = models.TextField()
test = models.TextField() # This field is to go away, bye-bye!
以及移民:
# app/migrations/003_remove_foo_test.py
class Migration(migrations.Migration):
dependencies = [
('app', '0002_foo_test'),
]
operations = [
migrations.RemoveField(
model_name='foo',
name='test',
),
]
取消应用此迁移会抛出异常:
$ src/manage.py migrate app 0002
Operations to perform:
Target specific migration: 0002_foo_test, from app
Running migrations:
Unapplying app.0003_remove_foo_test...Traceback (most recent call last):
...
django.db.utils.IntegrityError: column "test" contains null values
当然,这是预期的行为,它被明确记录了,并且我不会问为什么会发生这种情况:
请记住,反向操作实际上是向模型添加字段;如果该字段不可为空,则可能使此操作不可逆转(除了任何数据损失,当然不可逆转)。
然而,我们都会犯错误,有时候我们只是需要一些办法来撤销字段删除,即使这意味着需要手动提供所有已撤销非空字段的临时存根值。例如,South迁移可选地允许撤销此类操作(通过询问开发人员是否为恢复的字段提供默认值或禁止反向迁移),但似乎在全新的Django 1.7迁移中不是这种情况。
问题:在Django 1.7+迁移中,撤消字段删除的最简单/最快方法是什么(假设已经发生)? 它不一定需要完全使用Python脚本编写,一组手动说明也可以。
IntegrityError
而不是django.db.migrations.exceptions.IrreversibleError
?这个问题有没有讨论过? - Qback