Теперь, когда мы разобрались с теорией о моделях, их связях и работе с ними, пришло время закрепить знания на практике. Сегодня вы получите задание, которое позволит вам применить все три типа связей: OneToOne, ForeignKey, и ManyToMany. Также мы рассмотрим, как удобно организовывать данные в реальном проекте. Ну а в конце, конечно же, я брошу вам вызов — небольшое усложнение, так что держитесь крепко за свои клавиатуры!
Постановка задачи
Мы будем разрабатывать систему для управления курсами в некоем учебном заведении. Вот требуемый набор моделей:
- Курс (Course): каждый курс имеет название и может быть связан с несколькими студентами и учителем.
- Студент (Student): у каждого студента есть имя, и он может записаться на несколько курсов.
- Преподаватель (Teacher): каждый преподаватель преподаёт ровно один курс.
- Профиль студента (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()
Челлендж: усложняем задачу
Попробуйте усовершенствовать проект:
- Добавьте поле
descriptionв модельCourseдля описания курса. - Реализуйте метод в модели
Student, который возвращает список всех курсов студента. - Напишите запрос, который возвращает всех преподавателей, ведущих курсы, на которых учится определённый студент.
- Оптимизируйте запросы с помощью
select_related()иprefetch_related().
Что вы освоите
После выполнения задания и челленджа вы сможете:
- Работать с разными типами связей в реальных проектах.
- Использовать обратные связи для удобного доступа к связанным данным.
- Организовывать данные и обеспечивать целостность в Django.
- Оптимизировать запросы для повышения производительности.
Так что доставайте ваше любимое IDE, погружайтесь в код и создайте что-то крутое! Django — это замечательный инструмент, который открывает бесконечные горизонты для разработки веб-приложений. 🚀
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ