Ось готовий урок, створений спеціально для тебе у стилі 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.
- 🔹 База: Встановіть
djangorestframework, додайте його вINSTALLED_APPS. Створіть модельStudent(ім'я, вік, курс). - 🔹 Реплікація: Напишіть
StudentSerializerтаStudentViewSetза аналогією з прикладом вище. Підключіть це вurls.pyчерезDefaultRouter(погугліть, як працює router у DRF — це займе 2 хвилини). - 🔹 Експеримент: Відкрийте браузер. Спробуйте додати студента через форму DRF. Спробуйте видалити його.
- 🔹 Зміна умов: У
StudentSerializerзмінітьfields = '__all__'на список, де є тільки ім'я. Перевірте, чи зник вік з відповіді API. - 🔹 Виклик: Спробуйте відправити POST запит (створити студента), де замість віку (число) ви передасте слово "двадцять".
- Питання: Яку помилку поверне DRF? (Він зробить це за вас автоматично, без жодного
ifу вашому коді!).
- Питання: Яку помилку поверне DRF? (Він зробить це за вас автоматично, без жодного
- 🔹 Міні-кейс: Уявіть, що це API для шкільного журналу. Додайте поле
is_active(Boolean). Зробіть так, щоб API віддавав тільки активних студентів (підказка: змінітьquerysetуviews.py).
5. 💡 Мислення як у розробника
Як думає Senior Python Developer, коли працює з DRF?
- Помилка новачків: Вони намагаються пхати всю логіку у
views.py.- Як треба: "Товсті серіалізатори, худі в'юшки". Якщо вам треба перевірити, чи є студенту 18 років при реєстрації — пишіть цю валідацію в Serializer, а не в View.
- Мислить Ресурсами, а не Сторінками.
- Ми більше не думаємо "сторінка реєстрації". Ми думаємо "Ресурс User". Ми створюємо User (POST), отримуємо User (GET). Це зміна парадигми на REST-архітектуру.
- Не вигадує велосипед.
- 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! 💻🚀