Какую роль выполняет ModelViewSet в Django REST Framework?

Ответ

ModelViewSet в Django REST Framework (DRF) — это высокоуровневый класс, который объединяет в себе логику для полного набора стандартных CRUD-операций (Create, Retrieve, Update, Delete) для одной модели.

Он позволяет значительно сократить количество шаблонного кода, так как наследуется от GenericViewSet и включает в себя следующие mixin-классы:

  • CreateModelMixin — для создания объектов (POST)
  • RetrieveModelMixin — для получения одного объекта (GET by id)
  • UpdateModelMixin — для полного или частичного обновления (PUT/PATCH)
  • DestroyModelMixin — для удаления объекта (DELETE)
  • ListModelMixin — для получения списка объектов (GET list)

Пример использования:

# views.py
from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializers import BookSerializer

class BookViewSet(ModelViewSet):
    """Этот ViewSet автоматически предоставляет действия .list(), .retrieve(),
       .create(), .update(), .partial_update() и .destroy()."""
    queryset = Book.objects.all()
    serializer_class = BookSerializer

Основное преимущество ModelViewSet проявляется при использовании с маршрутизаторами (Routers), которые автоматически генерируют URL-шаблоны для всех стандартных действий.

# urls.py
from rest_framework.routers import DefaultRouter
from .views import BookViewSet

router = DefaultRouter()
router.register(r'books', BookViewSet, basename='book')

urlpatterns = router.urls
# Сгенерирует URL-ы типа /books/ и /books/{id}/

Для добавления нестандартных эндпоинтов, не входящих в CRUD, используются декораторы @action.