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.

1
Задача
Модуль 3: Django, 20 уровень, 9 лекция
Недоступна
Фильтрация заказов и кастомное действие
Фильтрация заказов и кастомное действие
1
Задача
Модуль 3: Django, 20 уровень, 9 лекция
Недоступна
Настройка прав доступа и кастомного маршрута для продуктов
Настройка прав доступа и кастомного маршрута для продуктов
3
Опрос
Настройка маршрутизации с использованием Routers, 20 уровень, 9 лекция
Недоступен
Настройка маршрутизации с использованием Routers
Настройка маршрутизации с использованием Routers
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ