Mal*_*umi 7 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中使用,是否有办法强制它们使用它?
bak*_*kal 16
Django和/或Python如何在Postgresql中生成UUID?
但是有很多种UUID,我一点也不清楚在Django中生成哪一个
当您UUIDField在Django中用作主键时,它不会为您生成UUID,您在保存对象之前自己生成UUID
我不知道自那以后事情是否发生了变化,但是上次我使用了a UUIDField,你必须自己指定UUID值(例如,当你创建对象时,Django不会让你用空UUID保存一个对象并且有数据库生成一个).查看Django文档示例强化了我的想法,因为它们提供了default=uuid.uuid4()例如主键.
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
^
|__ calls uuid.uuid4()
Run Code Online (Sandbox Code Playgroud)
要比较不同UUID版本的属性,请参阅此问题:要使用哪个UUID版本?
对于很多应用程序,UUID4就好了
如果你只是想要生成一个UUID并继续你的生活,uuid.uuid4()就像上面的代码段就好了.UUID4是一个随机的UUID,碰撞的可能性非常小,你真的不必担心,特别是如果你每秒都没有产生大量的UUID.
最后,考虑到博客文章中指出的碎片问题,假设
uuid_generate_v1mc不能直接在Python或Django中使用,是否有办法强制它们使用它?
带有随机MAC地址的Python UUID1,就像uuid-ossp是uuid_generate_v1mc
您链接的博客提到了UUID1的使用.Python使用的uuid.uuid1()是一个参数,而不是默认的实际硬件MAC地址(48位).因为这些随机位是UUID1的末尾,所以UUID1的第一位可以是基于顺序/时间戳的,以限制索引碎片.
所以
uuid.uuid1(random_48_bits)
Run Code Online (Sandbox Code Playgroud)
应该得到类似的结果uuid_generate_v1mc,这是一个带有随机MAC地址的UUID1.
要生成随机48位,作为一个虚拟示例,我们可以使用:
import random
random_48_bits = random.randint(0, 2**48 - 1)
Run Code Online (Sandbox Code Playgroud)
试试吧:
>>> import uuid
>>> import random
>>> 2 ** 48 - 1
281474976710655
>>> uuid.uuid1(random.randint(0, 281474976710655))
UUID('c5ecbde1-cbf4-11e5-a759-6096cb89d9a5')
Run Code Online (Sandbox Code Playgroud)
现在创建一个函数,并将其用作defaultDjangoUUIDField
自定义UUID,以及来自Instagram的示例
请注意,提供自定义UUID方案完全没问题,并使用可用位对可能对您的应用程序有用的信息进行编码.
例如,您可以使用几个位来编码给定用户的国家/地区,带有时间戳的几个位,带有随机性的一些位等.
您可能想了解Instagram(基于Django和PostgreSQL构建)如何制作自己的UUID方案以帮助进行分片.
| 归档时间: |
|
| 查看次数: |
8092 次 |
| 最近记录: |