Что такое ViewSet в Django REST Framework и из чего он состоит?

Ответ

ViewSet в DRF — это класс, который объединяет логику для набора связанных представлений (views) в одном месте. Вместо того чтобы создавать отдельные классы для операций чтения списка, создания, получения, обновления и удаления объекта, вы можете определить один ViewSet.

Основная цель ViewSet — уменьшить количество повторяющегося кода (boilerplate) и следовать принципу DRY (Don't Repeat Yourself). Его настоящая сила раскрывается при использовании вместе с Routers, которые автоматически генерируют URL-паттерны.

Основные составляющие ViewSet:

  1. Стандартные действия (Actions): Методы, которые сопоставляются с HTTP-запросами при использовании роутера:

    • .list() (GET-запрос на список)
    • .create() (POST-запрос)
    • .retrieve() (GET-запрос на один объект)
    • .update() (PUT-запрос)
    • .partial_update() (PATCH-запрос)
    • .destroy() (DELETE-запрос)
  2. Ключевые атрибуты:

    • queryset: Набор объектов, с которыми будет работать ViewSet.
    • serializer_class: Класс сериализатора для преобразования данных.
  3. Пользовательские действия: Можно добавлять собственные эндпоинты с помощью декоратора @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)