JavaRush /Курси /Модуль 3: Django /Практичне заняття зі створення ViewSet і маршрутизації

Практичне заняття зі створення ViewSet і маршрутизації

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

Ласкаво просимо на практичне заняття, де ми закріпимо все, що дізналися про ViewSet і маршрутизацію в Django REST Framework (DRF). Сьогодні ми будемо активно писати код, створювати API, тестувати маршрути та налаштовувати їх за допомогою Routers. Якщо в попередніх лекціях ви дізналися теорію, то тепер настав час застосувати її на практиці!

Цілі практичного заняття

  1. Створити повноцінний ViewSet для керування ресурсами.
  2. Налаштувати маршрутизацію з використанням Routers.
  3. Додати кастомні дії для обробки нестандартних запитів.
  4. Провести тестування 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/).

Приклади запитів

  1. Створення книги (POST /books/):

    {
        "title": "Django для початківців",
        "author": "Гвідо ван Россум",
        "published_date": "2023-01-01",
        "isbn": "1234567890123"
    }
    
  2. Отримання списку всіх книг (GET /books/).

  3. Отримання книги за ID (GET /books/1/).

  4. Використання кастомної дії (GET /books/recent_books/).

Крок 7. Завдання для самостійної практики

  1. Додайте ще одну кастомну дію, наприклад, щоб шукати книги за певним автором.
    • Підказка: використовуйте query_params для доступу до параметрів запиту.
  2. Налаштуйте використання SimpleRouter замість DefaultRouter. Перевірте різницю створених маршрутів.
  3. Створіть GenericViewSet для моделі книги, додавши кастомні методи.

Тепер у вас є повне уявлення про створення ViewSet та налаштування маршрутизації з Django REST Framework. Вітаю, ви щойно налаштували API, який можна використовувати у реальному застосунку! Якщо у вас виникли труднощі, не забувайте зазирати в документацію DRF.

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