🔖 Справочник: ViewSets, Routers, Generic Views

⚡ Шпаргалка

# ModelViewSet — полный CRUD
class XViewSet(viewsets.ModelViewSet):
    queryset = X.objects.all()
    serializer_class = XSerializer

# DefaultRouter
router = DefaultRouter()
router.register(r'url-prefix', XViewSet)
urlpatterns = [path('', include(router.urls))]

# Generic Views с двумя сериализаторами
class XListCreateView(ListCreateAPIView):
    queryset = X.objects.all()
    def get_serializer_class(self):
        return XSerializer if self.request.method == 'GET' else XCreateSerializer

class XDetailView(RetrieveUpdateDestroyAPIView):
    queryset = X.objects.all()
    def get_serializer_class(self):
        return XSerializer if self.request.method == 'GET' else XCreateSerializer

# URL для Generic Views
urlpatterns = [
    path('items/', XListCreateView.as_view()),
    path('items/<int:pk>/', XDetailView.as_view()),
]

# DjangoFilterBackend
filter_backends = [DjangoFilterBackend]
filterset_fields = ['field1', 'field2']

ModelViewSet

Атрибут/метод Назначение
queryset Набор объектов, с которыми работает ViewSet
serializer_class Сериализатор по умолчанию
get_serializer_class() Переопределяет сериализатор динамически
filter_backends Список бэкендов фильтрации
filterset_fields Поля, доступные для фильтрации

DefaultRouter: генерируемые URL

После router.register(r'items', ItemViewSet) создаются:

URL Метод Действие
/items/ GET Список объектов (list)
/items/ POST Создание (create)
/items/{pk}/ GET Получение объекта (retrieve)
/items/{pk}/ PUT Полное обновление (update)
/items/{pk}/ PATCH Частичное обновление (partial_update)
/items/{pk}/ DELETE Удаление (destroy)

Generic Views — классы

Класс HTTP методы Действие
ListCreateAPIView GET, POST Список + создание
RetrieveUpdateDestroyAPIView GET, PUT, PATCH, DELETE Деталь + обновление + удаление
ListAPIView GET Только список (read-only)
RetrieveAPIView GET Только деталь (read-only)

DjangoFilterBackend — установка и настройка

# 1. Установка
pip install django-filter

# 2. settings.py
INSTALLED_APPS = [
    ...
    'django_filters',
]

# 3. views.py
from django_filters.rest_framework import DjangoFilterBackend

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['category', 'price']

# 4. Использование
# GET /api/products/?category=2
# GET /api/products/?category=2&price=100
← К оглавлению урока    Примеры →