Как 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.