我尝试使用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以十六进制格式为我的标识符生成默认值的可能方法是什么?
答案 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将完成其余的工作。