Как использовать внешний ключ для создания отношений «многие к одному» в Django

В Django существует три основных типа отношений: один-к-одному, много-к-одному и много-ко-многим.

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

Отношения "многие-к-одному" иногда называют отношениями "один-ко-многим". Как будет показано ниже, это родственные термины.

Что такое отношения "многие к одному"?

Отношения Many-to-one - это тип отношений, при котором несколько записей в одной таблице связаны с одной записью в другой таблице.

Предположим, что у нас есть две таблицы в базе данных: Department и Employee. Отношение между Department и Employee является отношением one-to-many. У department может быть много employees, и каждый employee принадлежит одному department.

А отношения между employees и departments - это отношения many-to-one.

Это можно проиллюстрировать приведенной ниже схемой:

Add-a-little-bit-of-body-text

Диаграмма, иллюстрирующая отношения "многие-к-одному"

Например, отдел 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:

Screenshot-from-2023-07-03-18-26-26

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

Screenshot-from-2023-07-03-18-23-46

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

Screenshot-from-2023-07-03-18-23-57

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

Screenshot-from-2023-07-03-18-24-18

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

Screenshot-from-2023-07-03-18-24-28

Здесь вы передаете экземпляр объекта department для поля department.

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

Screenshot-from-2023-07-03-18-24-38

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

Screenshot-from-2023-07-03-18-40-45

Заключение

Отношения "многие-к-одному" широко используются в приложениях Django.

Они помогают создавать связи между моделями и облегчают выполнение запросов к базе данных.

Надеюсь, что данная статья была Вам полезна.

Вернуться на верх