Django:迁移后所有相同的UUID

时间:2017-12-20 18:12:52

标签: python django database-migration

我有一个mixin可以为任何模型添加UUID:

class UUIDable(models.Model):
    uuid = UUIDField(db_index=True,
                     default=uuid.uuid4,
                     editable=False)

    class Meta:
        abstract = True

我有一个包含Article个对象的现有数据库。 我刚刚使用上面的mixin向Article类添加了一个uuid字段。 运行迁移后,我的所有文章现在都具有 SAME UUID。 我希望所有对象都有不同的UUID。

为什么?

以下是自动创建的迁移文件:

class Migration(migrations.Migration):

    dependencies = [
        ('products', '0009_auto_20171218_1630'),
    ]

    operations = [
        migrations.AddField(
            model_name='article',
            name='uuid',
            field=models.UUIDField(db_index=True, default=uuid.uuid4, editable=False),
        ),
    ]

1 个答案:

答案 0 :(得分:0)

您的迁移正在添加一个单一值,您需要在迁移期间更改它。请看这个链接:"Migrations that add unique fields"

尝试更改迁移中的字段:

from django.db import migrations, models
import uuid

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


class Migration(migrations.Migration):

    dependencies = [
        ('products', '0009_auto_20171218_1630'),
    ]

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