Добро пожаловать на практическое занятие, где мы закрепим всё, что узнали о 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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ