阅读此博文后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中使用,有没有办法强制它们使用它?
答案 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版本的属性,请参阅此问题: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.0 与 RandomUUID
一起发布,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
的支持。
此函数返回版本 4(随机)UUID。这是最常用的 UUID 类型,适用于大多数应用程序。