如何在 Django 中使用 UUID 自动填充预先存在的数据库条目

mer*_*1er 2 django django-models

我已将 UUID 添加到以下模型:

class Post(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    ...
Run Code Online (Sandbox Code Playgroud)

但数据库中已经存在一些在没有该uuid字段的情况下创建的条目。
当我运行时migrate,它会将相同的 UUID 添加到我以前的所有对象中。

是否有一种简单的方法可以自动使用不同的 UUID 填充现有对象?

Wil*_*sem 9

我认为解决这个问题最简单的方法是进行数据迁移[Django-doc]。您可以使用以下命令创建新的迁移文件:

python manage.py makemigrations --empty yourappname
Run Code Online (Sandbox Code Playgroud)

这将在目录中创建一个不执行任何操作的新文件migrations/。我们可以使用如下所示的内容更改迁移文件:

# Generated by Django 3.2 on 2021-05-01 12:49

from django.db import migrations
from uuid import uuid4

class Migration(migrations.Migration):

    def populate_uuid(apps, schema_editor):
        Post = apps.get_model('yourappname', 'Post')
        posts = list(Post.objects.all())
        for post in posts:
            post.uuid = uuid4()
        Post.objects.bulk_update(posts, ['uuid'])

    dependencies = [
        ('yourappname', 'previous_migrationname'),
    ]

    operations = [
        migrations.RunPython(populate_uuid)
    ]
Run Code Online (Sandbox Code Playgroud)

如果您随后进行迁移,它将加载所有Post对象,为每个对象提供唯一的 uuid,然后批量更新项目。