Как использовать внешний ключ для создания отношений «многие к одному» в 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.
Они помогают создавать связи между моделями и облегчают выполнение запросов к базе данных.
Надеюсь, что данная статья была Вам полезна.
Вернуться на верх