Модуль 26

Django REST Framework: вступ

Ось готовий урок, створений спеціально для тебе у стилі David Malan. Вмикай уяву — ми починаємо!


🎓 УРОК: Django REST Framework (DRF) — Вступ

Рівень: Початківець у API (але знайомий з Django) Стиль: CS50 / David Malan


1. 🔥 Вступ: Коли ваш сайт перестає бути просто сайтом

Уявіть ситуацію. Ви створили чудовий інтернет-магазин на Django. Він працює, шаблони (HTML) рендеряться, користувачі заходять через браузер, купують кросівки. Все чудово.

Але раптом до вас приходить замовник і каже: "Слухай, ми хочемо запустити мобільний додаток для iOS та Android. І ще, можливо, розумний годинник, який показує статус замовлення".

Ви відкриваєте свій код, дивитесь на views.py, де ви повертаєте render(request, 'index.html'), і розумієте... У нас проблема.

Мобільний додаток не розуміє HTML. Йому не потрібні ваші красиві CSS-стилі, ваші <div> та <h1>. Йому потрібні чисті дані.

Запитання до вас: Як передати інформацію про кросівки (назва, ціна, розмір) з вашого сервера на телефон так, щоб телефон це зрозумів, але не передавати зайвого візуального сміття?

Тут на сцену виходить Django REST Framework (DRF).

Аналогія: Уявіть, що звичайний Django — це ресторан. Ви сідаєте за столик, офіціант приносить вам готову страву (HTML-сторінку), гарно сервіровану. А DRF — це склад-оптовик. Сюди приїжджають вантажівки (мобільні додатки, React-сайти). їм не потрібна сервіровка. Їм потрібні коробки з інгредієнтами (дані JSON), щоб вони самі вирішили, як це приготувати та подати клієнту.

Сьогодні ми навчимося перетворювати ваш "ресторан" на потужний логістичний центр.


2. 🧠 Теоретична база: Що відбувається під капотом?

Щоб зрозуміти DRF, нам треба розібрати всього три магічних слова. Не лякайтеся термінів, зараз все стане ясно.

1. Серіалізація (Serialization)

Це найважливіше. У Django у вас є об'єкти Python (наприклад, Product.objects.get(id=1)). Це складна структура в пам'яті комп'ютера. Інтернет не вміє передавати об'єкти Python. Інтернет розуміє текст.

Серіалізатор — це перекладач. Він бере ваш складний Python-об'єкт і перетворює його на простий текст (зазвичай у форматі JSON), який можна відправити по дротах. * Python Object ➡️ Serializer ➡️ JSON

Запам’ятайте: Серіалізатор відповідає на питання "Які поля моделі ми показуємо світу?".

2. ViewSet (Набір представлень)

У звичайному Django ви писали функції для кожної сторінки. У DRF ми часто використовуємо ViewSet. Це розумний контролер, який каже: "Я вмію обробляти запити на отримання списку, на створення, на видалення..." — і все це в одному класі.

3. JSON

Це мова, якою спілкуються програми. Це виглядає як словник у Python:

{
    "id": 1,
    "name": "Nike Air",
    "price": 100
}

Інтуїтивно: DRF — це просто шар, який стоїть між вашою базою даних і інтернетом, перетворюючи все на JSON і назад.


3. 🧪 Приклади: Від болю до магії

Давайте подивимось на код.

Етап 0: Підготовка

У нас є проста модель у models.py:

class Course(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    price = models.IntegerField()

Етап 1: Як би ми це робили БЕЗ DRF (Трохи болю)

Якби ми хотіли віддати JSON вручну, ми б писали щось таке:

# views.py (Поганий спосіб)
from django.http import JsonResponse

def course_list(request):
    courses = Course.objects.all()
    data = []
    for course in courses:
        data.append({
            'title': course.title,
            'price': course.price
        })
    return JsonResponse({'courses': data})

Чому це погано? Уявіть, що у вас 50 полів. Вам доведеться прописувати кожне вручну! А якщо треба прийняти дані (POST) і перевірити їх? Це пекло з if-ів.

Етап 2: Магія DRF (Правильний шлях)

Крок А: Створюємо serializers.py Ми просто кажемо DRF: "Візьми модель Course і перетвори всі поля на JSON".

# serializers.py
from rest_framework import serializers
from .models import Course

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = '__all__'  # Магія! Всі поля включено автоматично.

Крок Б: Створюємо views.py

# views.py
from rest_framework import viewsets
from .models import Course
from .serializers import CourseSerializer

class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

Зачекайте, це все? Так! Цей клас ModelViewSet вже містить логіку для: 1. Отримання списку (GET) 2. Створення (POST) 3. Отримання одного запису (GET id) 4. Оновлення (PUT/PATCH) 5. Видалення (DELETE)

Що ви очікуєте побачити, якщо відкриєте адресу /api/courses/? У звичайному браузері DRF покаже вам спеціальну веб-сторінку (Browsable API), де можна побачити JSON і навіть форми для відправки даних. Це супер зручно для тестування!


4. 🛠 Практична частина

Час забруднити руки кодом! Відкривайте свій IDE.

  1. 🔹 База: Встановіть djangorestframework, додайте його в INSTALLED_APPS. Створіть модель Student (ім'я, вік, курс).
  2. 🔹 Реплікація: Напишіть StudentSerializer та StudentViewSet за аналогією з прикладом вище. Підключіть це в urls.py через DefaultRouter (погугліть, як працює router у DRF — це займе 2 хвилини).
  3. 🔹 Експеримент: Відкрийте браузер. Спробуйте додати студента через форму DRF. Спробуйте видалити його.
  4. 🔹 Зміна умов: У StudentSerializer змініть fields = '__all__' на список, де є тільки ім'я. Перевірте, чи зник вік з відповіді API.
  5. 🔹 Виклик: Спробуйте відправити POST запит (створити студента), де замість віку (число) ви передасте слово "двадцять".
    • Питання: Яку помилку поверне DRF? (Він зробить це за вас автоматично, без жодного if у вашому коді!).
  6. 🔹 Міні-кейс: Уявіть, що це API для шкільного журналу. Додайте поле is_active (Boolean). Зробіть так, щоб API віддавав тільки активних студентів (підказка: змініть queryset у views.py).

5. 💡 Мислення як у розробника

Як думає Senior Python Developer, коли працює з DRF?

  1. Помилка новачків: Вони намагаються пхати всю логіку у views.py.
    • Як треба: "Товсті серіалізатори, худі в'юшки". Якщо вам треба перевірити, чи є студенту 18 років при реєстрації — пишіть цю валідацію в Serializer, а не в View.
  2. Мислить Ресурсами, а не Сторінками.
    • Ми більше не думаємо "сторінка реєстрації". Ми думаємо "Ресурс User". Ми створюємо User (POST), отримуємо User (GET). Це зміна парадигми на REST-архітектуру.
  3. Не вигадує велосипед.
    • DRF величезний. Потрібна пагінація (сторінки 1, 2, 3)? Це два рядки налаштувань. Потрібен пошук? Один рядок. Завжди спочатку дивіться в документацію.

6. 🧩 Підсумок

Сьогодні ми зробили квантовий стрибок. Ми перейшли від генерації HTML для людей до генерації JSON для машин.

Що ви тепер вмієте? 1. Пояснити різницю між HTML-сайтом і API. 2. Створювати серіалізатори, щоб перетворювати моделі на JSON. 3. Запускати повноцінний CRUD (Create, Read, Update, Delete) API за 10 хвилин.

Тизер наступного уроку: Зараз наше API відкрите для всіх. Будь-хто може видалити ваших студентів! У наступному уроці ми поговоримо про Permissions та Authentication. Ми поставимо охоронця на вході у ваш "склад даних".

А поки що — це був CS50... тобто, вступ до DRF! 💻🚀