返回十六进制 UUID 作为 Django 模型字符字段的默认值

Returning Hex UUID as default value for Django model charfield

我尝试使用从 uuid4 生成的标识符创建模型。但我想要的不是常规 uuid,而是我想要的标识符具有十六进制 uuid 格式(不带“-”)。这是我尝试过的:

class Model(models.Model):

    identifier = models.CharField(max_length=32, primary_key=True, default=uuid.uuid4().hex, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.identifier

    class Meta:
        abstract = True

不是每次继承 class 实例化时都返回唯一 ID,而是 returns 因为 uuid4() 相同的 ID。我试图将默认值从 uuid.uuid4().hex 更改为 uuid.uuid4.hex 但似乎 hex 无法直接从 uuid4 调用。那么从十六进制格式的 uuid 为我的标识符生成默认值的可能方法是什么?

您需要使其可调用

default=lambda: uuid.uuid4().hex

更新

正如@ZulwiyozaPutra 指出的那样。迁移时解决方案失败,我完全忘记了 Django 无法序列化 Lambdas。

解决方案是定义具有所需行为的新函数:

def hex_uuid():
    return uuid.uuid4().hex

并将此函数用作默认参数可调用:

identifier = models.CharField(default=hex_uuid, ...)
class Model(models.Model):

    identifier = models.CharField(max_length=32, primary_key=True, default=uuid.uuid4, editable=False)

如果您使用 uuid.uuid4() 函数将在 runserver 上执行,只需提供签名,剩下的由 django 完成。