JavaRush /Курсы /Модуль 3: Django /Практическое задание по работе с разными типами связей в ...

Практическое задание по работе с разными типами связей в Django

Модуль 3: Django
9 уровень , 9 лекция
Открыта

Теперь, когда мы разобрались с теорией о моделях, их связях и работе с ними, пришло время закрепить знания на практике. Сегодня вы получите задание, которое позволит вам применить все три типа связей: OneToOne, ForeignKey, и ManyToMany. Также мы рассмотрим, как удобно организовывать данные в реальном проекте. Ну а в конце, конечно же, я брошу вам вызов — небольшое усложнение, так что держитесь крепко за свои клавиатуры!

Постановка задачи

Мы будем разрабатывать систему для управления курсами в некоем учебном заведении. Вот требуемый набор моделей:

  1. Курс (Course): каждый курс имеет название и может быть связан с несколькими студентами и учителем.
  2. Студент (Student): у каждого студента есть имя, и он может записаться на несколько курсов.
  3. Преподаватель (Teacher): каждый преподаватель преподаёт ровно один курс.
  4. Профиль студента (StudentProfile): каждый студент может иметь дополнительную информацию, например дату рождения. Это реализуется через связь OneToOneField.

Задачи:

  • Создайте описанные модели с их связями.
  • Реализуйте миграции и внесите данные в базу через Django Admin.
  • Напишите несколько запросов для работы с данными, чтобы продемонстрировать, как осуществляются связи.

Реализация проекта

Шаг 1. Создание моделей

Создайте новое приложение courses в вашем Django проекте. Если забыли как, вот подсказка:

python manage.py startapp courses

Теперь опишем наши модели в файле models.py приложения courses:

from django.db import models

# Модель курса
class Course(models.Model):
    title = models.CharField(max_length=255)  # Название курса

    def __str__(self):
        return self.title

# Модель преподавателя
class Teacher(models.Model):
    name = models.CharField(max_length=255)  # Имя преподавателя
    course = models.OneToOneField(
        Course,
        on_delete=models.CASCADE,  # Удаляем преподавателя, если курс удалён
        related_name="teacher"    # Связь для обратного вызова
    )

    def __str__(self):
        return self.name

# Модель студента
class Student(models.Model):
    name = models.CharField(max_length=255)  # Имя студента
    courses = models.ManyToManyField(
        Course,
        related_name="students"  # Для обратного вызова: course.students.all()
    )

    def __str__(self):
        return self.name

# Профиль студента
class StudentProfile(models.Model):
    student = models.OneToOneField(
        Student,
        on_delete=models.CASCADE,  # Удаляем профиль, если студент удалён
        related_name="profile"    # Удобная связь: student.profile
    )
    date_of_birth = models.DateField(null=True, blank=True)  # Дата рождения

    def __str__(self):
        return f"Профиль {self.student.name}"

Шаг 2. Применение миграций

После написания моделей не забудьте их зарегистрировать в файле apps.py и сделать миграции:

# Создаем миграции
python manage.py makemigrations courses

# Применяем миграции к базе данных
python manage.py migrate

Теперь у нас есть все модели и структура базы данных готова.

Шаг 3. Добавление данных через Django Admin

Добавьте модели в админ-зону для удобного управления. Откройте admin.py в приложении courses и зарегистрируйте модели:

from django.contrib import admin
from .models import Course, Teacher, Student, StudentProfile

admin.site.register(Course)
admin.site.register(Teacher)
admin.site.register(Student)
admin.site.register(StudentProfile)

Перейдите в админ-зону по адресу http://127.0.0.1:8000/admin/, добавьте несколько курсов, преподавателей и студентов. Не забудьте заполнить профили для студентов!

Шаг 4. Работа с запросами

Теперь давайте напишем несколько запросов для демонстрации работы со связями.

Получаем всех студентов на курсе:

from courses.models import Course

course = Course.objects.get(title="Программирование на Python")
students = course.students.all()  # Используем related_name
for student in students:
    print(student.name)

Находим преподавателя, который ведёт определённый курс:

teacher = course.teacher  # Используем related_name в OneToOneField
print(teacher.name)

Добавляем студента на курс:

from courses.models import Student

student = Student.objects.get(name="Иван Иванов")
course.students.add(student)  # ManyToMany связь

Удаляем студента с курса:

course.students.remove(student)

Работа с профилем студента:

profile = student.profile  # OneToOne связь
profile.date_of_birth = "2000-05-15"
profile.save()

Челлендж: усложняем задачу

Попробуйте усовершенствовать проект:

  1. Добавьте поле description в модель Course для описания курса.
  2. Реализуйте метод в модели Student, который возвращает список всех курсов студента.
  3. Напишите запрос, который возвращает всех преподавателей, ведущих курсы, на которых учится определённый студент.
  4. Оптимизируйте запросы с помощью select_related() и prefetch_related().

Что вы освоите

После выполнения задания и челленджа вы сможете:

  • Работать с разными типами связей в реальных проектах.
  • Использовать обратные связи для удобного доступа к связанным данным.
  • Организовывать данные и обеспечивать целостность в Django.
  • Оптимизировать запросы для повышения производительности.

Так что доставайте ваше любимое IDE, погружайтесь в код и создайте что-то крутое! Django — это замечательный инструмент, который открывает бесконечные горизонты для разработки веб-приложений. 🚀

1
Задача
Модуль 3: Django, 9 уровень, 9 лекция
Недоступна
Создание моделей OneToOne и ForeignKey
Создание моделей OneToOne и ForeignKey
1
Задача
Модуль 3: Django, 9 уровень, 9 лекция
Недоступна
Реализация модели ManyToMany
Реализация модели ManyToMany
3
Опрос
Организация связи между приложениями, 9 уровень, 9 лекция
Недоступен
Организация связи между приложениями
Организация связи между приложениями
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Уровень 59
14 августа 2025
> Перейдите в админ-зону по адресу http://127.0.0.1:8000/admin/, добавьте несколько курсов, преподавателей и студентов. Прежде чем заходить в админку не забываем создать Администратора. Как это делается вскользь рассказывали в самом начале модуля.