Тепер, коли ми розібралися з теорією про моделі, їх зв'язки та роботу з ними, настав час закріпити знання на практиці. Сьогодні ви отримаєте завдання, яке дозволить вам застосувати всі три типи зв'язків: 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 — це чудовий інструмент, який відкриває безкінечні горизонти для розробки вебзастосунків. 🚀
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ