返回十六进制 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 完成。
我尝试使用从 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 完成。