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

Zul*_*tra 3 python django uuid hex

我试图用从 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
Run Code Online (Sandbox Code Playgroud)

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

vis*_*ell 5

你需要让它可调用

default=lambda: uuid.uuid4().hex
Run Code Online (Sandbox Code Playgroud)

更新

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

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

def hex_uuid():
    return uuid.uuid4().hex
Run Code Online (Sandbox Code Playgroud)

并使用此函数作为可调用的默认参数:

identifier = models.CharField(default=hex_uuid, ...)
Run Code Online (Sandbox Code Playgroud)