如果我有一个不可为空的模型字段,将其删除,然后创建一个迁移,该迁移将变得不可逆:
请考虑以下模型:
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
当然,这是预期行为,是clearly documented,我不是在问为什么会发生这种情况:
请记住,当反转时,这实际上是将一个字段添加到 模型;如果该字段不可为空,则可能会执行此操作 不可逆转(除了任何数据丢失,这当然是 不可逆).
然而,我们都会犯错误,有时我们只需要need比somehow就可以反转字段删除,即使这意味着要手动为所有反转的非空字段手动提供一个特殊的存根值.例如,南迁移可以 Select 性地允许反转这些操作(通过询问开发人员是否为恢复的字段提供默认值,或者不允许反向迁移),而全新的奇特的Django 1.7迁移似乎不是这样.
Question: what is the easiest/fastest way to undo a field removal with Django 1.7+ migrations (assuming it has already happened)?它不一定需要用Python编写完整的脚本,一组手动说明就可以了.