返回Hex UUID作为Django model charfield的默认值

时间:2018-01-25 08:29:34

标签: python django hex uuid

我尝试使用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

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

2 个答案:

答案 0 :(得分:3)

你需要让它可以调用

default=lambda: uuid.uuid4().hex

更新

正如@ZulwiyozaPutra所说。迁移时解决方案失败,我完全忘记的是Django无法序列化Lambdas。

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

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

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

identifier = models.CharField(default=hex_uuid, ...)

答案 1 :(得分:0)

class Model(models.Model):

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

如果使用uuid.uuid4(),该函数将在runserver上执行,只需给出签名,django将完成其余的工作。