Внимание! В данном шаге мы лишь рассмотрим дополнительные опции моделей Django, в наш проект мы их пока добавлять не будем.
UUID
Универсальный уникальный идентификатор — это 128-битное число, обычно представленное в виде 32 шестнадцатеричных символов, разделенных четырьмя дефисами. Вероятность дублирования UUID не равна нулю, но достаточно близка к нулю, чтобы ею можно было пренебречь.
Идентификатор, который Django использует «из коробки», увеличивается последовательно. Это означает, что 5-й зарегистрированный пользователь имеет id = 5, а 6-й = 6. Итак, если я зарегистрируюсь и выясню, что мой id = 17, я знаю, что до меня было зарегистрировано 16 человек, и я могу попытаться добраться до их данных, используя их идентификатор. Это делает ваше приложение очень уязвимым.
Вот где UUID пригодится. Ключ UUID генерируется случайным образом, поэтому он не несет никакой информации о том, сколько людей зарегистрировано на странице или какой у них может быть идентификатор.
В Django есть специальное поле UUIDField для хранения UUID.
import uuid
from django.db import models
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Вы добавили новое поле id UUIDField и создали это поле PRIMARY_KEY для Runner таблицы. UUID может быть создан 5 различными способами , но вам, вероятно, понадобится уникальная и случайно сгенерированная версия — версия 4. Вы устанавливаете ее по умолчанию с помощью default=uuid.uuid4. И мы не хотим, чтобы кто-либо изменил это поле, поэтому мы установили editable значение False.
Теперь id нашего работника будет выглядеть как id = 1fb7c19d-919e-406f-ad41-7dcba6520ed2, а не id = 1.
Choices
class Employee(models.Model):
class Workplace(models.IntegerChoices):
JOB_1 = 1, 'Junior'
JOB_2 = 2, 'Middle'
JOB_3 = 3, 'Senior'
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
workspace = models.PositiveSmallIntegerField(choices=Workplace.choices, default=Workplace.JOB_1,
help_text="Position in the company?")
Мы создали класс Choice (перечисление) Workplace, который имеет 3 членов. Первая часть (например, JOB_1) — это имя перечисления. Вторая часть (например, 1) является фактическим значением. Третья часть (например. 'Junior') представляет собой удобочитаемое имя, метку. Это то, что вы увидите в админке.
Класс Choices имеет два подкласса — IntegerChoicesи TextChoices. Поскольку нас интересуют только номера "уровней работников", мы использовали IntegerChoices(неважно, что имена констант и метки строковые, вы выбираете тип на основе значений).
Теперь нам нужно связать эти варианты с полем базы данных. Поскольку мы указали IntegerChoices, это поле должно быть одним из целочисленных полей. Поскольку мы знаем, что всегда будет лишь несколько возможных зон, мы выбрали PositiveSmallIntegerField. Мы подключили класс Choice к полю с помощью choices=Workplace.choices. Мы выбрали значение по умолчанию для поля, и здесь вы можете увидеть, как мы получаем доступ к одному из членов ( Workplace.JOB_1). Новое дополнение также help_text- это будет отображаться либо в форме, либо в админке, чтобы помочь пользователю узнать, какие данные ему нужно ввести.
__str__()
Если мы откроем http://127.0.0.1:8000/admin/hr/employee/ , мы увидим список добавленных работников.
Вы можете просто увидеть объект с некоторым идентификатором. Если вы хотите отредактировать кого-то, вам нужно будет открыть каждый из объектов и найти тот, у которого правильное имя и фамилия. Метод, который заботится о том, как объекты выглядят, когда они представлены в виде строки (например, в списке работников), является методом __str__.
__str__— это метод Python, который возвращает строковое представление любого объекта. Это то, что Django использует для отображения экземпляров модели в виде простой строки.
Вам не нужно использовать только переменные для создания строкового представления объекта. Если вы хотите, чтобы работники были представлены в форме "first_name, last_name", вы можете сделать это:
def __str__(self):
return f'{self.first_name}, {self.last_name}'