Поле UUIDField

Поле UUIDField в Django предназначено для хранения UUID (Universally Unique Identifier) - 128-битных уникальных идентификаторов. Это поле автоматически генерирует уникальные значения, что делает его идеальным выбором для первичных ключей или полей, требующих глобальной уникальности. По умолчанию UUIDField использует версию 4 UUID, которая генерируется на основе случайных чисел.

При создании модели с UUIDField можно указать параметр default со значением uuid.uuid4 для автоматической генерации UUID при создании записи. Также поле поддерживает параметр primary_key, позволяющий использовать UUID в качестве первичного ключа вместо стандартного автоинкрементируемого целочисленного поля.

Синтаксис

pythonfrom django.db import models
import uuid

class MyModel(models.Model):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  uuid_field = models.UUIDField(default=uuid.uuid4, unique=True)

Пример

Давайте создадим модель для хранения пользователей с уникальным идентификатором:

pythonfrom django.db import models
import uuid

class UserProfile(models.Model):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  name = models.CharField(max_length=100)
  email = models.EmailField(unique=True)

  def __str__(self):
    return self.name

Теперь создадим несколько пользователей и посмотрим на их идентификаторы:

pythonfrom myapp.models import UserProfile

user1 = UserProfile.objects.create(name="John Doe", email="john@example.com")
user2 = UserProfile.objects.create(name="Jane Smith", email="jane@example.com")

print(user1.id)
print(user2.id)

Результат выполнения кода:

python"3f2504e0-4f89-41d3-9a0c-0305e82c3301"
"c3f7b0a0-8b2d-4a5e-8f3c-1b2d3e4f5a6b"

Пример

Используем UUIDField в качестве внешнего ключа для связи с другой моделью:

pythonfrom django.db import models
import uuid

class Category(models.Model):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name

class Article(models.Model):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  title = models.CharField(max_length=200)
  category = models.ForeignKey(Category, on_delete=models.CASCADE)

  def __str__(self):
    return self.title

Создадим категорию и статью, чтобы увидеть, как работает связь:

pythonfrom myapp.models import Category, Article

category = Category.objects.create(name="Technology")
article = Article.objects.create(
  title="Django UUID Field Guide",
  category=category
)

print(f"Category ID: {category.id}")
print(f"Article ID: {article.id}")
print(f"Article Category ID: {article.category.id}")

Результат выполнения кода:

python"Category ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890"
"Article ID: b2c3d4e5-f6a7-8901-bcde-f234567890ab"
"Article Category ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890"

Пример

Фильтрация записей по UUID полю с использованием методов QuerySet:

pythonfrom myapp.models import Article
import uuid

# Фильтрация по точному совпадению UUID
specific_uuid = uuid.UUID("b2c3d4e5-f6a7-8901-bcde-f234567890ab")
article = Article.objects.get(id=specific_uuid)
print(article.title)

# Фильтрация по списку UUID
uuid_list = [
  uuid.UUID("b2c3d4e5-f6a7-8901-bcde-f234567890ab"),
  uuid.UUID("c3d4e5f6-a7b8-9012-cdef-34567890abcd")
]
articles = Article.objects.filter(id__in=uuid_list)
for article in articles:
  print(article.title)

Результат выполнения кода:

python"Django UUID Field Guide"
"Article 1"
"Article 2"

Смотрите также

  • поле CharField,
    которое используется для хранения строковых данных
  • поле IntegerField,
    которое хранит целочисленные значения
  • поле BooleanField,
    которое хранит логические значения (True/False)
  • поле DateTimeField,
    которое хранит дату и время