Введение в отношения Django One-To-One
В реляционной базе данных отношение «один-к-одному» — это тип отношения, в котором каждая запись одной таблицы связана только с одной записью в другой таблице. Этот тип взаимосвязи удобен в ситуациях, когда у вас есть одна часть данных, которая тесно связана с другой частью данных, например, у пользователя есть только один профиль, у компании есть только один адрес или у каждого сотрудника есть контакт, и каждый контакт принадлежит одному сотруднику. Таким образом, отношения между сотрудниками и контактами являются отношениями «один-к-одному».
В Django отношения «один-к-одному» реализуются с помощью класса OneToOneField. Это поле особого типа, ForeignKey позволяющее добавить уникальное ограничение, гарантирующее, что каждая запись в одной таблице связана только с одной записью в другой таблице. Используя отношение «один-к-одному» в Django, вы можете создавать более эффективные и масштабируемые модели баз данных, упрощая управление данными и их обслуживание.
OneToOneField(<связываемая модель>, on_delete=<поведение при удалении записи>, [<остальные параметры>])
Чтобы настроить отношение «один-к-одному» в Django, вам нужно определить две отдельные модели. Первая модель представляет родительскую таблицу, а вторая модель представляет дочернюю таблицу. В родительской таблице вы добавите OneToOneField, который используется для определения связи между двумя таблицами.
В следующем примере OneToOneField класс используется для определения отношения «один-к-одному» между моделями Contact и Employee в models.py:
from django.db import models
class Contact(models.Model):
phone = models.CharField(max_length=50, unique=True)
address = models.CharField(max_length=50)
def __str__(self):
return self.phone
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
def __str__(self):
return f'{self.first_name} {self.last_name}'
Класс Employee имеет contact атрибут, который ссылается на экземпляр класса OneToOneField.
В поле OneToOneField мы указываем Contact модель и on_delete параметр, определяющий поведение при удалении объекта контакта. Параметр on_delete = models.CASCADE означает, что при удалении объекта Contact объект, связанный с ним, Employee также будет удален автоматически.
Перенос моделей в БД
Сначала выполните миграцию с помощью makemigrations команды:
python manage.py makemigrations
Во-вторых, примените миграции к базе данных с помощью migrate команды:
python manage.py migrate
За кулисами Django создает две таблицы hr_contact и hr_employee в базе данных:
В таблице hr_employee есть contact_id столбец, который является внешним ключом , который ссылается на идентификатор (первичный ключ) таблицы hr_contact.
Связывание контакта с сотрудником
Чтобы взаимодействовать с моделями Employee и Contact, вы запускаете shell_plus команду с --print-sql параметром:
python manage.py shell_plus --print-sql
Опция --print-sql выводит команду SQL, которую выполняет Django.
Сначала создайте новый Employee объект и сохраните его в базе данных:
e = Employee(first_name='John',last_name='Doe')
e.save()
Django выполняет следующую команду SQL:
Создайте и сохраните новый контакт в базе данных:
c = Contact(phone='+79120000000', address='Moscow city, Leninsky avenue, house 11')
c.save()
Django также выполняет следующую INSERT команду:
В-третьих, свяжите контакт с сотрудником:
e.contact = c
e.save()
Django обновляет значение столбца contact_id в hr_employee таблице до значения столбца id в hr_contact таблице.