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)
Запустите сервер
python manage.py runserver
Плюсы и минусы использования UUID в качестве первичных ключей
Плюсы:
- Глобальная уникальность: идентификаторы UUID уникальны для разных систем, что делает их идеальными для распределенных приложений, где объекты создаются в нескольких местах.
- Безопасность: Идентификаторы UUID менее предсказуемы, чем автоматически увеличивающиеся целые числа, что затрудняет злоумышленникам угадывание идентификаторов объектов.
- Масштабируемость: UUID полезны в больших системах, где при объединении данных из разных источников могут возникнуть конфликты в первичных ключах.
- Предотвращает перечисление: Поскольку UUID являются случайными, пользователи не могут легко выполнять перечисление с помощью наших идентификаторов объектов, увеличивая числа в URL.
Минусы:
- Размер хранилища: идентификаторы UUID занимают больше места для хранения (128 бит против 32 бит для целого числа), что может повлиять на размер базы данных и производительность при больших наборах данных.
- Производительность: Индексация и запрос UUID-идентификаторов могут выполняться медленнее, чем запрос целых чисел, особенно в больших наборах данных.
- Нечитаемый для человека: идентификаторы UUID неудобны для пользователя, когда нам нужно отлаживать или вручную взаимодействовать с ними в базе данных.
- Накладные расходы: Добавление UUID к URL-адресам может оказаться необязательным для небольших и простых приложений, где безопасность и распределенные системы не вызывают беспокойства.
Вывод
Использование UUID в качестве первичного ключа в моделях Django обеспечивает преимущества безопасности и масштабируемости в определенных случаях использования, особенно в распределенных системах или когда предсказуемость URL-адресов должна быть сведена к минимуму. Однако это сопряжено с компромиссами, такими как увеличение объема хранилища и потенциальные проблемы с производительностью. В зависимости от потребностей нашего приложения, UUID могут быть мощной альтернативой автоматически увеличивающимся первичным ключам по умолчанию.