如何使用Django创建短UUID

7

我有一个模型和UUID作为主键字段。UUID id太长了。我想让它像YouTube一样变得短。

class Video(models.Model):
    id = models.UUIDField(
        primary_key=True, 
        default=uuid.uuid4, 
        editable=False,
    )

不要这样做

UUID('b39596dd-10c9-42c9-91ee-9e45b78ce3c1')

我希望只有这个

UUID('b39596dd')

我该如何实现上述目标?

为什么不使用CharField并手动创建该字段的uuid主键呢? - Arpit Solanki
@ArpitSolanki 看起来需要做很多工作,我该怎么办? - sql-noob
要明确一点,OP正在寻求UUID的紧凑表示,而不是存储在更少位中的UUID。 - Flimm
3个回答

5

这是一个有点老的问题,但是 shortuuidfield 可能是你正在寻找的。


1
你可以使用shortuuid库:
from shortuuid.django_fields import ShortUUIDField
id = ShortUUIDField(primary_key=True, length=11, max_length=11)

但你应该注意这个问题。UUID 大小越小,碰撞的概率就越高。

1

uuid 的第一部分被定义为 time_low,因此我们可以这样做,不过它将不再是 uuid.UUID 类型。

sample = uuid.uuid4()

UUID('6af2fd74-fbaf-4a9a-a973-8d052634a624')

tl = sample.time_low

1794309492L

然后我们只需将其转换回十六进制即可,

hex(int(tl.time_low))[2:]

'6af2fd74'

你可以像普通字符串一样分割它,但我不明白为什么这很重要。一旦你将其分配给一个变量,它就是一个给定的值,因此你可以按照自己的选择进行解析。


1
它有多独特?在什么时候会引起问题? - sql-noob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接