UUID В Качестве Первичного Ключа В Моделях Django

При создании приложений на Django мы часто полагаемся на автоматически увеличивающийся первичный ключ (id), генерируемый базой данных. Однако в некоторых случаях использование UUID (универсально уникальных идентификаторов) в качестве первичных ключей может обеспечить такие преимущества, как безопасность, уникальность в распределенных системах и снижение предсказуемости URL-адресов или идентификаторов объектов.

В этой статье мы рассмотрим, что такое UUID в моделях Django, расскажем о том, как создать проект, использующий UUID в качестве первичного ключа, и обсудим плюсы и минусы такого подхода.

Что такое UUID в моделях Django?

UUID (универсальный уникальный идентификатор) - это 128-разрядное число, используемое для уникальной идентификации объектов или информации. UUID обычно представляют в виде 32-символьной строки (шестнадцатеричный формат) в виде сегментов 8-4-4-4-12. Они уникальны во всем мире и могут создаваться независимо от базы данных.

В Django поля UUID могут быть реализованы с использованием UUIDField из Django model fields. Это обеспечивает более безопасный, непредсказуемый и уникальный идентификатор по сравнению с автоматически увеличивающимся целым полем по умолчанию, используемым для первичных ключей.

Использование UUID в качестве первичного ключа в моделях Django

Шаг 1: Создайте новый проект Django

Начните с создания нового проекта и приложения на Django

django-admin startproject myprojectcd myprojectpython manage.py startapp myapp

Добавить приложение в settings.py файл

Python INSTALLED_APPS = [# ...,'myapp'
]

Django Project Structure

Шаг 2: Измените модель, чтобы использовать UUID в качестве первичного ключа

В файле models.py внутри приложения мы определим модель, которая использует UUID в качестве первичного ключа.

  • UUIDField: Это поле используется для хранения UUID.
  • primary_key=True: Это делает UUID первичным ключом для данной модели.
  • по умолчанию=uuid.uuid4: При создании нового объекта генерируется новый UUID.
  • редактируемый=False: Это предотвращает редактирование UUID.
Python import uuid
from django.db import models

class Post(models.Model):id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)title = models.CharField(max_length=100)content = models.TextField()

    def __str__(self):return self.title

Шаг 3: Запуск миграции

После определения модели нам нужно создать и применить миграции, чтобы отразить изменения в базе данных:

python manage.py makemigrationspython manage.py migrate

Шаг 4: Используйте UUID в URL-адресах

Если мы хотим включить UUID в нашу маршрутизацию URL-адресов, мы можем обновить нашу urls.py:

Python from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [path('admin/', admin.site.urls),path('post/<uuid:id>/', views.post_detail, name='post_detail'),
]

В нашем views.py мы можем получить объект Post по UUID:

Python from django.shortcuts import render, get_object_or_404
from .models import Post

def post_detail(request, id):post = get_object_or_404(Post, id=id)return render(request, 'post_detail.html', {'post': post})

post_detail.html : Это простой HTML-файл, в котором будут отображаться заголовок и содержание публикации.

HTML <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{ post.title }}</title>
</head>
<body><h1>{{ post.title }}</h1><p>Post UUID: {{ post.id }}</p><p>{{ post.content }}</p>
</body>
</html>

Шаг 5: Протестируйте реализацию

Чтобы протестировать реализацию, мы можем создать новые объекты Post в панели администратора Django или с помощью оболочки Django:

python manage.py shell

Создайте запись и распечатайте UUID

Python from myapp.models import Post
post = Post.objects.create(title='My first post', content='Hello World!')
print(post.id)  

постт

Индивидуально получите UUID

Python from myapp.models import Post

# Retrieve a post by any field, such as title, or just get the first one
# or Post.objects.get(title="Your post title")
post = Post.objects.first()

# Print the UUID
print(post.id)

сохранить2

Запустите сервер

python manage.py runserver

Плюсы и минусы использования UUID в качестве первичных ключей

Плюсы:

  • Глобальная уникальность: идентификаторы UUID уникальны для разных систем, что делает их идеальными для распределенных приложений, где объекты создаются в нескольких местах.
  • Безопасность: Идентификаторы UUID менее предсказуемы, чем автоматически увеличивающиеся целые числа, что затрудняет злоумышленникам угадывание идентификаторов объектов.
  • Масштабируемость: UUID полезны в больших системах, где при объединении данных из разных источников могут возникнуть конфликты в первичных ключах.
  • Предотвращает перечисление: Поскольку UUID являются случайными, пользователи не могут легко выполнять перечисление с помощью наших идентификаторов объектов, увеличивая числа в URL.

Минусы:

  • Размер хранилища: идентификаторы UUID занимают больше места для хранения (128 бит против 32 бит для целого числа), что может повлиять на размер базы данных и производительность при больших наборах данных.
  • Производительность: Индексация и запрос UUID-идентификаторов могут выполняться медленнее, чем запрос целых чисел, особенно в больших наборах данных.
  • Нечитаемый для человека: идентификаторы UUID неудобны для пользователя, когда нам нужно отлаживать или вручную взаимодействовать с ними в базе данных.
  • Накладные расходы: Добавление UUID к URL-адресам может оказаться необязательным для небольших и простых приложений, где безопасность и распределенные системы не вызывают беспокойства.

Вывод

Использование UUID в качестве первичного ключа в моделях Django обеспечивает преимущества безопасности и масштабируемости в определенных случаях использования, особенно в распределенных системах или когда предсказуемость URL-адресов должна быть сведена к минимуму. Однако это сопряжено с компромиссами, такими как увеличение объема хранилища и потенциальные проблемы с производительностью. В зависимости от потребностей нашего приложения, UUID могут быть мощной альтернативой автоматически увеличивающимся первичным ключам по умолчанию.