使用uuid字段进行Django迁移会生成重复的值 [英] Django migration with uuid field generates duplicated values

查看:189
本文介绍了使用uuid字段进行Django迁移会生成重复的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 uuid 字段(不是主键)。生成的迁移是:

I have a uuid field (not a primary key). The generated migration is:

from __future__ import unicode_literals

from django.db import migrations, models
import uuid


class Migration(migrations.Migration):

    dependencies = [
        ....
    ]

    operations = [
        ...
        migrations.AddField(
            model_name='device',
            name='uuid',
            field=models.UUIDField(default=uuid.uuid4, unique=True),
        ),
        ...
    ]

但是在执行 python manage.py migration 时,它崩溃了:

But when doing python manage.py migrate it is crashing with:


django.db.utils.IntegrityError:无法创建唯一索引
restaurants_device_uuid_key详细信息:密钥
(uuid)=(f3858ded-b8e0-4ac0-8436

django.db.utils.IntegrityError: could not create unique index "restaurants_device_uuid_key" DETAIL: Key (uuid)=(f3858ded-b8e0-4ac0-8436-8a61b10efc73) is duplicated.

奇怪的是,主键似乎没有出现问题(可能是c

Strangely enough, the problem does not seem to occur with primary keys (which are maybe created by the database, and not internally by django?)

如何添加uuid字段并确保迁移有效?

How can I add a uuid field, and make sure that migrations work?

推荐答案

在此示例中,由于有了RunPython调用,一次迁移即可完成所有操作。

Here is an example doing everything in one single migration thanks to a RunPython call.

# -*- coding: utf-8 -*
from __future__ import unicode_literals

from django.db import migrations, models
import uuid


def create_uuid(apps, schema_editor):
    Device = apps.get_model('device_app', 'Device')
    for device in Device.objects.all():
        device.uuid = uuid.uuid4()
        device.save()


class Migration(migrations.Migration):

    dependencies = [
        ('device_app', 'XXXX'),
    ]

    operations = [
        migrations.AddField(
            model_name='device',
            name='uuid',
            field=models.UUIDField(blank=True, null=True),
        ),
        migrations.RunPython(create_uuid),
        migrations.AlterField(
            model_name='device',
            name='uuid',
            field=models.UUIDField(unique=True)
        )
    ]

这篇关于使用uuid字段进行Django迁移会生成重复的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆