Ласкаво просимо на практичне заняття, де ми закріпимо все, що дізналися про ViewSet і маршрутизацію в Django REST Framework (DRF). Сьогодні ми будемо активно писати код, створювати API, тестувати маршрути та налаштовувати їх за допомогою Routers. Якщо в попередніх лекціях ви дізналися теорію, то тепер настав час застосувати її на практиці!
Цілі практичного заняття
- Створити повноцінний ViewSet для керування ресурсами.
- Налаштувати маршрутизацію з використанням Routers.
- Додати кастомні дії для обробки нестандартних запитів.
- Провести тестування API для перевірки роботи маршрутів і ViewSet.
Розробка: API для керування книгами
У якості нашого "бойового завдання" ми створимо API для керування колекцією книг – ідеальний приклад CRUD-операцій. Кожна книга матиме такі властивості:
id: унікальний ідентифікатор.title: назва книги.author: автор книги.published_date: дата публікації.isbn: міжнародний стандартний номер книги.
Крок 1. Налаштування моделі
Спочатку розробимо модель Book, якщо вона ще не була створена. Додайте її до models.py у відповідному додатку.
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.CharField(max_length=255)
published_date = models.DateField()
isbn = models.CharField(max_length=13, unique=True)
def __str__(self):
return self.title
Не забудьте виконати міграції для створення таблиці в базі даних:
python manage.py makemigrations
python manage.py migrate
Крок 2. Створення серіалізатора
Тепер створимо серіалізатор для моделі Book. Це дозволить перетворювати дані між Python-об'єктами та JSON.
Додайте наступний код до файлу serializers.py:
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__' # Або вкажіть конкретні поля, наприклад: ['id', 'title', 'author']
Крок 3. Створення ViewSet
Тепер розробимо ViewSet для виконання CRUD-операцій із книгами. Ми будемо використовувати ModelViewSet, оскільки воно автоматично реалізує все необхідне: створення, читання, оновлення та видалення.
Додайте наступний код до файлу views.py:
from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializers import BookSerializer
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
Розбір коду:
queryset = Book.objects.all()– визначає, які дані ми будемо отримувати з бази для обробки запитів.serializer_class = BookSerializer– вказує, який серіалізатор використовується для перетворення даних.
Крок 4. Налаштування маршрутів з Routers
Давайте підключимо наш ViewSet до маршрутів. Це легко зробити за допомогою DefaultRouter.
Додайте наступний код до файлу urls.py:
from rest_framework.routers import DefaultRouter
from django.urls import path, include
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet, basename='book')
urlpatterns = [
path('', include(router.urls)),
]
Пояснення
DefaultRouterавтоматично створює маршрути для всіх стандартних дій (list,create,retrieve,update,destroy).router.register()реєструє наш ViewSet. Параметрr'books'задає базовий шлях для маршрутів.
Приклад створених маршрутів:
| Метод | URL | Опис |
|---|---|---|
| GET | /books/ | Отримати список книг |
| POST | /books/ | Створити нову книгу |
| GET | /books/{id}/ | Отримати книгу за ID |
| PUT | /books/{id}/ | Повне оновлення книги |
| PATCH | /books/{id}/ | Часткове оновлення |
| DELETE | /books/{id}/ | Видалити книгу |
Крок 5. Додавання кастомної дії
Час додати "вишеньку на торт"! Створимо кастомний метод для нашого ViewSet, який дозволить отримувати книги, випущені після певної дати.
У файлі views.py доповніть BookViewSet наступним кодом:
from rest_framework.decorators import action
from rest_framework.response import Response
class BookViewSet(ModelViewSet):
# ... ваш попередній код тут
@action(detail=False, methods=['get'])
def recent_books(self, request):
"""
Повертає книги, опубліковані за останні 10 років.
"""
import datetime
ten_years_ago = datetime.date.today() - datetime.timedelta(days=10*365)
recent_books = Book.objects.filter(published_date__gte=ten_years_ago)
serializer = self.get_serializer(recent_books, many=True)
return Response(serializer.data)
Параметри дії:
detail=False– вказує, що ця дія застосовується до колекції (а не до окремого об'єкта).methods=['get']– вказує, що ця дія доступна за HTTP-методом GET.
Новий маршрут буде доступний за адресою /books/recent_books/.
Крок 6. Тестування API
Запустіть локальний сервер:
python manage.py runserver
І перевірте API за допомогою інструменту типу Postman або вбудованої web-панелі DRF (доступної за адресою /books/).
Приклади запитів
Створення книги (POST
/books/):{ "title": "Django для початківців", "author": "Гвідо ван Россум", "published_date": "2023-01-01", "isbn": "1234567890123" }Отримання списку всіх книг (GET
/books/).Отримання книги за ID (GET
/books/1/).Використання кастомної дії (GET
/books/recent_books/).
Крок 7. Завдання для самостійної практики
- Додайте ще одну кастомну дію, наприклад, щоб шукати книги за певним автором.
- Підказка: використовуйте
query_paramsдля доступу до параметрів запиту.
- Підказка: використовуйте
- Налаштуйте використання SimpleRouter замість DefaultRouter. Перевірте різницю створених маршрутів.
- Створіть GenericViewSet для моделі книги, додавши кастомні методи.
Тепер у вас є повне уявлення про створення ViewSet та налаштування маршрутизації з Django REST Framework. Вітаю, ви щойно налаштували API, який можна використовувати у реальному застосунку! Якщо у вас виникли труднощі, не забувайте зазирати в документацію DRF.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ