【发布时间】:2015-05-06 20:33:11
【问题描述】:
如果我有一个不可为空的模型字段,请将其删除并创建一个迁移,该迁移将变得不可逆:
考虑以下模型:
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,我不是在问为什么会这样:
请记住,当反转时,这实际上是将一个字段添加到 模型;如果该字段不可为空,则可能会执行此操作 不可逆的(除了任何数据丢失,这当然是 不可逆转)。
然而,我们都会犯错误,有时我们只是需要以以某种方式撤消字段删除,即使这意味着手动为所有已撤消的非-空字段。例如,South 迁移可以选择允许此类操作的反转(通过询问开发人员是否为恢复的字段提供默认值,或禁止反向迁移),这似乎不是所有新的花哨的 Django 1.7 迁移的情况.
问题:使用 Django 1.7+ 迁移撤消字段删除的最简单/最快的方法是什么(假设它已经发生)?它不一定需要使用 Python 编写完整的脚本,一套手动说明就可以了。
【问题讨论】:
标签: django django-south django-1.7 django-migrations