Django UUIDField如何在Postgresql中生成UUID?

时间:2016-02-04 20:15:21

标签: python django postgresql uuid

阅读此博文后https://blog.starkandwayne.com/2015/05/23/uuid-primary-keys-in-postgresql/

我想知道更多关于Django如何生成uuid的原因,因为我将它们用作我的pk。好吧,根据文档https://docs.djangoproject.com/es/1.9/ref/models/fields/#uuidfield,Django依赖于Python UUID模块https://docs.python.org/3/library/uuid.html#uuid.UUID。但是有很多种类的UUID,对于我来说,在Django中生成哪一个,或者如何选择,假设有一个选择,我一点都不清楚。

最后,鉴于博客文章中指出了碎片问题,假设uuid_generate_v1mc不能直接在Python或Django中使用,有没有办法强制它们使用它?

2 个答案:

答案 0 :(得分:15)

  
      
  • Django和/或Python如何在Postgresql中生成UUID?

  •   
  • 但是有很多种UUID,我一点也不清楚在Django中生成哪一个

  •   

当您在Django中使用UUIDField作为主键时,它不会为您生成一个UUID,您在保存对象之前自己生成它

我不知道自那以后事情是否发生了变化,但是上次我使用UUIDField时,你必须自己指定UUID值(例如,当你创建对象时,Django赢了' t允许您使用空白UUID保存对象并让数据库生成一个)。查看Django文档示例强化了我的想法,因为它们提供default=uuid.uuid4()例如在主键中。

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
                                                    ^
                                                    |__ calls uuid.uuid4() 

选择哪个UUID版本

要比较不同UUID版本的属性,请参阅此问题:Which UUID version to use?

对于很多应用程序,UUID4很好

如果您只是想要生成UUID并继续生活,uuid.uuid4()就像上面的代码段一样好了。 UUID4是一个随机UUID,碰撞的可能性非常小,你真的不必担心,特别是如果你每秒都没有产生大量的UUID。

  

最后,考虑到博文中指出的碎片问题,假设uuid_generate_v1mc不能直接在Python或Django中使用,有没有办法强迫他们使用它?

具有随机MAC地址的Python UUID1,例如uuid-ossp' s uuid_generate_v1mc

您关联的博客提到了UUID1的使用。 Python的uuid.uuid1()采用的是一个参数,而不是默认的实际硬件MAC地址(48位)。因为这些随机位是UUID1的末尾,所以UUID1的第一位可以是基于顺序/时间戳的,以限制索引碎片。

所以

uuid.uuid1(random_48_bits)

应该得到与uuid_generate_v1mc类似的结果,Instagram (built on Django and PostgreSQL) cooked up their own UUID scheme to help with sharding是具有随机MAC地址的UUID1。

要生成一个随机的48位,作为一个虚拟示例,我们可以使用:

import random
random_48_bits = random.randint(0, 2**48 - 1)

试一试:

>>> import uuid
>>> import random
>>> 2 ** 48 - 1
281474976710655
>>> uuid.uuid1(random.randint(0, 281474976710655))
UUID('c5ecbde1-cbf4-11e5-a759-6096cb89d9a5')

现在创建一个函数,并将其用作Django的default UUIDField

自定义UUID,以及来自Instagram的示例

请注意,提供自定义UUID方案完全没问题,并使用可用位对可能对您的应用程序有用的信息进行编码。

E.g。您可以使用几位来编码给定用户的国家/地区,带有时间戳的几位,有些随机性位等等。

您可能想了解{{3}}的方式。

答案 1 :(得分:0)

In 2017 Django 2.0RandomUUID 一起发布,gen_random_uuid 是一个在数据库中创建 UUID 的数据库函数。如果您不想要服务器生成的 UUID,这很方便。

from django.contrib.postgres.functions import RandomUUID

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=RandomUUID, editable=False)

注意它只生成 uuid v4。如果您在 postgres 中需要其他 uuid,则必须自己添加对 uuid-ossp 的支持。

上的 Postgres 文档。

<块引用>

此函数返回版本 4(随机)UUID。这是最常用的 UUID 类型,适用于大多数应用程序。