Как использовать внешний ключ для создания отношений «многие к одному» в Django
В Django существует три основных типа отношений: один-к-одному, много-к-одному и много-ко-многим.
В этой статье я расскажу об отношениях "многие-к-одному" в Django. Если вы новичок, имеющий некоторые знания о настройке проекта Django, или даже имеете некоторый приличный опыт работы с Django, вы можете следовать этой статье.
Отношения "многие-к-одному" иногда называют отношениями "один-ко-многим". Как будет показано ниже, это родственные термины.
Что такое отношения "многие к одному"?
Отношения Many-to-one - это тип отношений, при котором несколько записей в одной таблице связаны с одной записью в другой таблице.
Предположим, что у нас есть две таблицы в базе данных: Department и Employee. Отношение между Department и Employee является отношением one-to-many. У department может быть много employees, и каждый employee принадлежит одному department.
А отношения между employees и departments - это отношения many-to-one.
Это можно проиллюстрировать приведенной ниже схемой:

Диаграмма, иллюстрирующая отношения "многие-к-одному"
Например, отдел Account может иметь много отделов employees (one-to-many), и все эти отделы employees принадлежат отделу account (many-to-one).
Как создать модели для отношений "многие-к-одному"
В данном учебном пособии приложение будет иметь две модели: Department и Employee.
Итак, начнем добавлять код для моделей.
from django.db import models
class Department(models.Model):
name=models.CharField(max_length=50)
def __str__(self):
return self.name
class Employee(models.Model):
name=models.CharField(max_length=70)
address=models.CharField(max_length=90)
department=models.ForeignKey(Department, on_delete=models.CASCADE)
def __str__(self):
return self.name
МодельDepartment содержит только одно поле, name.
Модель Employee содержит поля name и address, а также поле ForeignKey (department), которое ссылается на модель Department. Именно по этой причине в качестве первого аргумента передается Department.
Второй аргумент, on_delete, задает поведение при удалении объекта ссылки, которое в данном случае равно Department. Опция models.CASCADE означает, что при удалении объекта Department все связанные с ним объекты Employee также будут удалены.
Что такое внешний ключ в модели Django?
Внешний ключ используется для связи двух таблиц и устанавливает отношения many-to-one. Вы можете определить foreign key в модели Django с помощью поля models.ForeignKey. Причем это поле ForeignKey принимает как минимум два аргумента:
department = models.ForeignKey(Department, on_delete=models.CASCADE)
Мы уже обсуждали эти два аргумента в предыдущем разделе.
Кроме того, вы можете передавать и другие аргументы, например related_name со значением, что позволит вам получить доступ к foreign keys, определенным в ваших моделях Django, в обратном направлении.
Миграция баз данных
Теперь можно выполнять миграции с помощью команды makemigrations.
manage.py makemigrations
После этого можно вносить изменения в базу данных с помощью команды migrate.
manage.py migrate
Как взаимодействовать с моделями
Теперь давайте поиграем с shell, чтобы понять основные понятия many-to-one отношений.
Сначала необходимо выполнить команду shell:

Затем импортируйте модели в shell. Здесь имя приложения company.

А теперь создадим несколько отделов.

Теперь можно составить Department.objects.all() запрос, возвращающий QuerySet, содержащий все Department объекты в базе данных.

На следующем шаге создадим несколько сотрудников, emp1, emp2 и emp3:

Здесь вы передаете экземпляр объекта department для поля department.
Если необходимо получить все employees для конкретного department, которым в данном примере является programming, то можно использовать следующий запрос:

Вы также можете использовать любой объект employee для получения записи из department. Здесь используется объект emp1.

Заключение
Отношения "многие-к-одному" широко используются в приложениях Django.
Они помогают создавать связи между моделями и облегчают выполнение запросов к базе данных.
Надеюсь, что данная статья была Вам полезна.
Вернуться на верх