Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

2.2 Связь One-To-One (Один к одному)
2 из 2 шагов пройдено

Введение в отношения 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 таблице.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.