JavaRush /Курси /Модуль 3: Django /Вступ до зв'язків між моделями

Вступ до зв'язків між моделями

Модуль 3: Django
Рівень 9 , Лекція 0
Відкрита

Сьогодні ми починаємо вивчення однієї з найважливіших тем: зв'язки між моделями. Це фундаментальна концепція реляційних баз даних і основа для побудови складних і реальних застосунків. Готуйтесь, сьогодні ми будемо зв'язувати все і вся, включаючи ваші мозкові клітини з нашими прикладами!

Вступ до зв'язків у реляційних базах даних

Почнемо з питань: що таке зв'язок у реляційній базі даних і навіщо він потрібен? Реляційні бази даних, такі як PostgreSQL або SQLite, організовують дані в таблицях, кожна з яких представляє окрему сутність. Наприклад, таблиця користувачів User і таблиця статей Article. Але самі по собі таблиці не розповідають, як дані пов'язані між собою. Як дізнатися, яка стаття належить якому користувачу? Як визначити їхні відносини один з одним?

Ось тут на сцену виходять зв'язки. Зв'язок — це спосіб зв'язати дані з однієї таблиці з даними з іншої. Django, як веб-фреймворк, робить використання цих зв'язків майже таким же легким, як замовити піцу в один клік.

Ось які вони бувають:

  1. Один-до-одного (One-to-One): кожен рядок в одній таблиці відповідає строго одному рядку в іншій. Приклад: у кожного користувача може бути лише один профіль.
  2. Один-до-багатьох (One-to-Many): один рядок у таблиці може бути пов'язаний із кількома рядками в іншій таблиці. Приклад: один користувач може написати багато статей.
  3. Багато-до-багатьох (Many-to-Many): кожен рядок в одній таблиці може бути пов'язаний із кількома рядками в іншій таблиці, і навпаки. Приклад: одна стаття може мати кілька тегів, і один тег може бути пов'язаний із кількома статтями.

У Django всі ці зв'язки описуються за допомогою полів моделей, таких як OneToOneField, ForeignKey та ManyToManyField.

Використання зв'язків у Django

Django перетворює реляційні зв'язки на потужний інструмент. Коли ти описуєш зв'язок між моделями, Django автоматично створює відповідну структуру бази даних. Ось головні переваги використання зв'язків:

  1. Логічна організація даних: Зв'язки допомагають моделювати реальний світ. Наприклад, якщо ти розробляєш блог, ти можеш зв'язати статті з авторами.
  2. Економія часу: Django бере на себе більшу частину роботи з налаштування зв'язків у базі даних.
  3. Легкий доступ до даних: Дивлячись на модель, ти одразу бачиш, як дані пов'язані. Це робить код більш читабельним та зручним у підтримці.
  4. Оптимізація запитів: За допомогою інструментів на кшталт select_related та prefetch_related можна мінімізувати кількість запитів до бази даних.

Переходимо до реальної практики.

Приклад: блог із таблицями та зв'язками

Уявіть, що ви створюєте блог. У кожного автора є профіль (наприклад, адреса електронної пошти, короткий опис). Також кожен автор може писати кілька статей, і кожна стаття може мати багато тегів.

Ось як ця структура виглядає в термінах зв'язків:

  • Один-до-одного між автором і профілем.
  • Один-до-багатьох між автором і статтями.
  • Багато-до-багатьох між статтями і тегами.

Давайте почнемо з підготовки бази: створимо проєкт із додатком blog, якщо ви його ще не зробили.

Якщо ви пропустили попередні лекції, не біда. Швидко створимо проєкт і додаток, щоб продовжити:

django-admin startproject myproject
cd myproject
python manage.py startapp blog

Не забудьте зареєструвати додаток blog у INSTALLED_APPS вашого settings.py:

INSTALLED_APPS = [
    ...
    'blog',
]

Тепер створимо структури бази. Ось модель, яка описує зв'язок між авторами, профілями, статтями і тегами.

from django.db import models

# Один-до-одного: кожен автор має один профіль
class Profile(models.Model):
    bio = models.TextField()
    website = models.URLField(blank=True, null=True)

    def __str__(self):
        return f"Profile: {self.website or 'No website'}"


class Author(models.Model):
    name = models.CharField(max_length=100)
    profile = models.OneToOneField(Profile, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


# Один-до-багатьох: один автор пише багато статей
class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title


# Багато-до-багатьох: статті можна зв'язувати з тегами
class Tag(models.Model):
    name = models.CharField(max_length=50)
    articles = models.ManyToManyField(Article, related_name='tags')

    def __str__(self):
        return self.name

Давайте розберемося з кодом:

  1. OneToOneField (профіль і автор):

    • Поле profile у моделі Author пов'язує її з моделлю Profile. Кожен автор може мати рівно один профіль. Якщо профіль видаляється, автор також видаляється завдяки on_delete=models.CASCADE.
  2. ForeignKey (автор і статті):

    • Поле author у моделі Article вказує на зв'язок один-до-багатьох. Кожен автор може бути пов'язаний із багатьма статтями.
  3. ManyToManyField (статті і теги):

    • Поле articles у моделі Tag — це приклад двонаправленого зв'язку. Тег може бути пов'язаний із кількома статтями, а стаття — із кількома тегами. Ми використовуємо параметр related_name для зручного доступу до тегів зі статті.

Після створення моделей не забудьте створити і виконати міграції:

python manage.py makemigrations
python manage.py migrate

Як працювати зі зв'язками в Django

Після налаштування зв'язків ви можете легко додавати, отримувати та зв'язувати дані. Ось кілька прикладів:

  1. Створення автора та профілю:
# Створити профіль
profile = Profile.objects.create(bio="Python Developer", website="https://example.com")

# Створити автора та прив'язати до профілю
author = Author.objects.create(name="Jane Doe", profile=profile)
  1. Створення статті та її прив'язка до автора:
article = Article.objects.create(title="Django ORM Basics", content="Content...", author=author)
  1. Додавання тегів до статті:
tag1 = Tag.objects.create(name="Django")
tag2 = Tag.objects.create(name="Python")

article.tags.add(tag1, tag2)  # Прив'язуємо теги до статті
  1. Отримання даних через зв'язки:
# Отримати всі статті автора
author_articles = author.article_set.all()

# Отримати всі статті, пов'язані з тегом "Django"
django_articles = tag1.articles.all()

Чому це важливо?

Використання зв'язків між моделями робить ваш проєкт більш структурованим і потужним. Це дозволяє легко масштабувати додаток, додаючи нові функціональності, такі як складні запити, модульні зв'язки між сутностями та оптимізація запитів.

На реальних співбесідах вміння працювати зі зв'язками стане вашим козирем: мало хто хоче працювати з розробниками, які замість зручних реляційних зв'язків будують складні й неефективні костилі.

Прийміть цей виклик і переконайтесь, що ви розумієте реляційні зв'язки як свої п'ять пальців. У наступній лекції ми зануримось глибше і подивимось, як реалізувати і використовувати зв'язок один-до-одного з реальними прикладами.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ