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 — це чудовий інструмент, який відкриває безкінечні горизонти для розробки вебзастосунків. 🚀

3
Опитування
Організація зв'язку між додатками, рівень 9, лекція 9
Недоступний
Організація зв'язку між додатками
Організація зв'язку між додатками
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ