gpt4 book ai didi

python - Django UUIDField 默认值

转载 作者:行者123 更新时间:2023-12-05 09:04:26 28 4
gpt4 key购买 nike

我有一个 Django 模型,我想在其中添加一个 UUIDField:

uuid = models.UUIDField(
default = uuid.uuid4,
unique = True,
editable = False
)

我希望这个 uuid 是唯一的,但是在迁移现有数据库时,出现以下错误:

django.db.utils.IntegrityError: (1062, "Duplicate entry '3ba46cb5f7f340ffa43e348cb789901a' for key 'carbon.uuid'")

如果另一个 uuid 已被使用,我如何提供默认值?

最佳答案

你这里有很多问题,有 3 个步骤可以实现你的目标。

  1. 如果您的模型中已有数据,您必须将其定义为 null=True 并删除 default=uuid.uuid4。为什么?因为如果您输入默认值,它会在您运行迁移时尝试向所有模型添加相同的默认地址,因此它当然会给您错误 django.db.utils.IntegrityError: (1062, "键“carbon.uuid”的重复条目“3ba46cb5f7f340ffa43e348cb789901a”) 因为每行使用相同的 uuid

  2. 创建迁移以更新模型中的现有行并将它们放入一个 uuid,如下所示:phython src/manage.py makemigrations app --name set_uuid_mymodel --empty

# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations
import uuid

def gen_uuid(apps, schema_editor):
MyModel = apps.get_model('myapp', 'MyModel')
for row in MyModel.objects.all():
row.uuid = uuid.uuid4()
row.save(update_fields=['uuid'])

class Migration(migrations.Migration):

dependencies = [
('myapp', '0004_add_uuid_field'),
]

operations = [
# omit reverse_code=... if you don't want the migration to be reversible.
migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
]

看官方文档:https://docs.djangoproject.com/en/3.0/howto/writing-migrations/#migrations-that-add-unique-fields

然后你可以在模型的save方法中管理新行生成uuid:

def save(self, *args, **kwargs):
''' On save, update uuid and ovoid clash with existing code '''
if not self.uuid:
self.uuid = uuid.uuid4()
return super(YourModel, self).save(*args, **kwargs)

关于python - Django UUIDField 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68651292/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com