如何在不允许数据库中的空值的情况下在Django迁移中构造`backwards`函数?

时间:2015-12-17 22:35:27

标签: django django-migrations

我正在实施this answer以向具有现有行的数据库添加自动UUIDField

建议的数据迁移调整是:

from django_extensions.utils import uuid

def forwards(self, orm):
    for item in orm['mypp.myclass'].objects.all():
        if not item.uuid:
            item.uuid = uuid.uuid4() #creates a random GUID
            item.save()


def backwards(self, orm):
    for item in orm['mypp.myclass'].objects.all():
        if item.uuid:
            item.uuid = None
            item.save()

但是,我不想允许blank=True使用我的模型。在这种情况下,我如何调整backwards()函数?当前item.uuid = None将不再有效......

1 个答案:

答案 0 :(得分:1)

您必须分3个步骤进行迁移:

  1. 使用UUIDField添加null=True,以便现有行不会破坏约束。

  2. 创建数据迁移以填充与当前代码类似的现有行的uuids。

  3. 通过从字段声明中删除null=True,添加另一个带NOT NULL约束的迁移。

  4. PS:您的代码适用于过时的南迁移。 django-migrations的当前等价物是:

    def forwards(apps, schema_editor):
        MyClass = apps.get_model('myapp', 'MyClass')
        for item in MyClass.objects.all():
            # [...]