如果我有一个不可为空的模型字段,将其删除,然后创建一个迁移,该迁移将变得不可逆:

请考虑以下模型:

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,我不是在问为什么会发生这种情况:

请记住,当反转时,这实际上是将一个字段添加到 模型;如果该字段不可为空,则可能会执行此操作 不可逆转(除了任何数据丢失,这当然是 不可逆).

然而,我们都会犯错误,有时我们只需要needsomehow就可以反转字段删除,即使这意味着要手动为所有反转的非空字段手动提供一个特殊的存根值.例如,南迁移可以 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编写完整的脚本,一组手动说明就可以了.

推荐答案

您可以手动编辑迁移,并在RemoveField之前的字段中添加AlterField(默认值为AlterField).即使在应用迁移之后,它也应该是安全的.这将使RemoveField之后发生的事情是可逆的.

举个例子.在模型summary中具有名为profit的字段,该字段在删除之前定义,如下所示:

profit = models.PositiveIntegerField(verbose_name='profits')

你应该在RemoveField之前加上一个AlterField,就像这样:

migrations.AlterField(
    model_name='summary',
    name='profit',
    field=models.PositiveIntegerField(verbose_name='profits', default=0),
    preserve_default=False,
    ),

Django相关问答推荐

批量删除多对多条目?

Django/SendGrid-密码重置-发件人地址与验证的发件人身份不匹配.";

如何使用Django';S生成的字段来统计相关对象?

如何将Django项目连接到容器化的PostgreSQL数据库?

django 的 Manager.create() 方法有什么作用?

相同的字符串不同的翻译

何时在 django 中使用 pre_save、save、post_save?

如何从 django 自定义中间件类返回 rest_framework.response 对象?

在 Django CharFields 中自动截断 max_length 字段

如何在 Django 模板上实现 back链接?

目前使用 Django Evolution,South是否更好,值得切换?

使用基于日期/时间的对象进行 Django 单元测试

virtualenv(python3.4), pip install mysqlclient 错误

Python 社区里的小马是怎么回事?

使用直通模型了解 Django 中的多对多字段

Django 自定义用户邮箱帐户验证

Django Rest Framework 序列化程序中的循环依赖

Django 中的自定义 HTTP 标头

Django ModelForm 覆盖小部件

try 使用 pip 安装 django-heroku 时,出现错误ERROR: Command errored out with exit status 1: python.