Ответ
ViewSet в DRF — это класс, который объединяет логику для набора связанных представлений (views) в одном месте. Вместо того чтобы создавать отдельные классы для операций чтения списка, создания, получения, обновления и удаления объекта, вы можете определить один ViewSet.
Основная цель ViewSet — уменьшить количество повторяющегося кода (boilerplate) и следовать принципу DRY (Don't Repeat Yourself). Его настоящая сила раскрывается при использовании вместе с Routers, которые автоматически генерируют URL-паттерны.
Основные составляющие ViewSet:
-
Стандартные действия (Actions): Методы, которые сопоставляются с HTTP-запросами при использовании роутера:
.list()(GET-запрос на список).create()(POST-запрос).retrieve()(GET-запрос на один объект).update()(PUT-запрос).partial_update()(PATCH-запрос).destroy()(DELETE-запрос)
-
Ключевые атрибуты:
queryset: Набор объектов, с которыми будет работатьViewSet.serializer_class: Класс сериализатора для преобразования данных.
-
Пользовательские действия: Можно добавлять собственные эндпоинты с помощью декоратора
@action.
Пример ModelViewSet (предоставляет полный CRUD):
from rest_framework import viewsets, permissions, routers
from .models import Book
from .serializers import BookSerializer
# ViewSet объединяет всю логику для модели Book
class BookViewSet(viewsets.ModelViewSet):
"""
Этот ViewSet автоматически предоставляет действия `list`, `create`, `retrieve`,
`update`, `partial_update` и `destroy` для модели Book.
"""
queryset = Book.objects.all()
serializer_class = BookSerializer
permission_classes = [permissions.IsAuthenticated]
# В файле urls.py роутер создаст все необходимые URL-адреса
router = routers.DefaultRouter()
router.register(r'books', BookViewSet)
# Будут сгенерированы URL-ы, такие как:
# /books/ (GET, POST)
# /books/{id}/ (GET, PUT, PATCH, DELETE)