Как Django UUIDField генерирует UUID в Postgresql?
после прочтения этого сообщения в блоге https://blog.starkandwayne.com/2015/05/23/uuid-primary-keys-in-postgresql/
Я хотел узнать больше о том, как Django генерирует uuid, потому что я использую их в качестве своего ПК. Ну, согласно документам,https://docs.djangoproject.com/es/1.9/ref/models/fields/#uuidfield, Django полагается на модуль Python UUIDhttps://docs.python.org/3/library/uuid.html#uuid.UUID. Но есть много видов UUID, и мне совсем не ясно, какой из них генерируется в Django, или как выбрать, предполагая, что выбор доступен.
наконец, учитывая проблему фрагментации, указанную в сообщении в блоге, и предполагая uuid_generate_v1mc
не доступен непосредственно в Python или Django, есть ли способ, чтобы заставить их использовать его?
1 ответов
как Django и или Python генерируют UUID в Postgresql?
но есть много видов UUID, и мне совсем не ясно, какой из них генерируется в Django
при использовании UUIDField
в качестве первичного ключа в Django он не генерирует UUID для вас, вы генерируете его самостоятельно, прежде чем сохранить объект
я не знаю, если все изменились с тех пор, но в последний раз я использовал 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()
какую версию UUID выбрать
для сравнения свойств различных версий UUID пожалуйста, смотрите этот вопрос:какую версию UUID использовать?
для многих приложений, UUID4 просто отлично
если вы просто хотите просто хотите создать UUID и продолжить свою жизнь,uuid.uuid4()
как фрагмент выше, просто отлично. UUID4-это случайный UUID, и вероятность столкновения настолько мала, что вам не нужно беспокоиться, особенно если вы не генерируете тонну их в секунду.
наконец, учитывая проблему фрагментации, указанную в сообщении в блоге, и предполагая
uuid_generate_v1mc
не доступен непосредственно в Python или Django, есть ли способ, чтобы заставить их использовать его?
Python UUID1 со случайным MAC-адресом, например uuid-ossp
' s uuid_generate_v1mc
в блоге вы связаны упоминает использование UUID1. В Python uuid.uuid1()
принимает параметр, который используется вместо реального аппаратного MAC-адреса по умолчанию (48 бит). Потому что эти случайные биты-это конец UUID1, первые биты UUID1 могут быть последовательными / временными метками, чтобы ограничить фрагментацию индекса.
так
uuid.uuid1(random_48_bits)
должны получить аналогичные результаты, как uuid_generate_v1mc
, который является UUID1 со случайным MAC-адресом.
для генерации случайных 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')
теперь сделайте из него функцию и используйте ее как default
для вашего Джанго!--4-->
пользовательские UUIDs и пример из Instagram
обратите внимание, что совершенно нормально придумать свою пользовательскую схему UUID и использовать доступные биты для кодирования информации, которая может быть полезна для вашего приложения.
Е. Г. вы можете использовать несколько битов для кодирования стране данного пользователя, несколько битов с меткой времени, некоторые биты случайности и т. д.
вы можете прочитать как Instagram (построен на Django и PostgreSQL) придумали свою собственную схему UUID, чтобы помочь с sharding.