Ответ
ViewSet в Django REST Framework (DRF) — это класс, который объединяет логику для набора связанных представлений (views) в одной сущности. Вместо того чтобы создавать отдельные классы для списка, деталей, создания и обновления объекта (ListView, DetailView), ViewSet позволяет определить все эти операции как методы одного класса.
Основное преимущество — уменьшение дублирования кода (DRY).
ViewSet не обрабатывает HTTP-методы (get, post) напрямую. Вместо этого он предоставляет действия (actions), такие как list, retrieve, create, update, destroy.
Пример с ModelViewSet
ModelViewSet — это самый мощный вид ViewSet, который автоматически реализует полный набор CRUD-операций для модели.
-
Определение
ViewSet:# views.py from rest_framework import viewsets from .models import Book from .serializers import BookSerializer class BookViewSet(viewsets.ModelViewSet): """ API эндпоинт, который позволяет просматривать и редактировать книги. """ queryset = Book.objects.all().order_by('-publication_date') serializer_class = BookSerializer -
Регистрация с помощью
Router:DRF
Routerавтоматически создает URL-шаблоны на основе зарегистрированногоViewSet.# urls.py from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import BookViewSet # Создаем роутер и регистрируем наш ViewSet router = DefaultRouter() router.register(r'books', BookViewSet, basename='book') # URL-шаблоны теперь генерируются роутером автоматически urlpatterns = [ path('', include(router.urls)), ]
Результат
Роутер сгенерирует следующие URL-маршруты:
GET /books/→list()(список всех книг)POST /books/→create()(создание новой книги)GET /books/{pk}/→retrieve()(получение одной книги)PUT /books/{pk}/→update()(полное обновление книги)PATCH /books/{pk}/→partial_update()(частичное обновление книги)DELETE /books/{pk}/→destroy()(удаление книги)