📝 Django

DRF ViewSets и Роутеры

P
Автор
PyLand Team
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
285
🌳
Уровень
Продвинутый

ViewSet — класс объединяющий несколько связанных view в один. Router автоматически генерирует URL.

ModelViewSet — полный CRUD

from rest_framework import viewsets, permissions
from .models import Task
from .serializers import TaskSerializer

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    permission_classes = [permissions.IsAuthenticated]

Автоматически создаёт:

Метод URL Действие
GET /tasks/ list
POST /tasks/ create
GET /tasks/{id}/ retrieve
PUT /tasks/{id}/ update
PATCH /tasks/{id}/ partial_update
DELETE /tasks/{id}/ destroy

DefaultRouter

from rest_framework.routers import DefaultRouter
from django.urls import path, include
from .views import TaskViewSet

router = DefaultRouter()
router.register('tasks', TaskViewSet, basename='task')
router.register('projects', ProjectViewSet, basename='project')

urlpatterns = [
    path('api/', include(router.urls)),
]

Кастомные действия (@action)

from rest_framework.decorators import action
from rest_framework.response import Response

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

    @action(detail=True, methods=['post'])
    def complete(self, request, pk=None):
        task = self.get_object()
        task.status = 'done'
        task.save()
        return Response({'status': 'completed'})

    @action(detail=False, methods=['get'])
    def my_tasks(self, request):
        tasks = Task.objects.filter(owner=request.user)
        serializer = self.get_serializer(tasks, many=True)
        return Response(serializer.data)

URL: POST /api/tasks/{id}/complete/, GET /api/tasks/my_tasks/

ReadOnlyModelViewSet

from rest_framework import viewsets

class CategoryViewSet(viewsets.ReadOnlyModelViewSet):
    """Только GET запросы — list и retrieve."""
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

settings.py: настройки Django

settings.py — центральный конфигурационный файл Django-проекта.

📅 30.06.2026 👁️ 316
📝

Django: чеклист для продакшна

Перед публикацией Django-проекта проверь настройки безопасности, базы данных, статических файлов, HTTPS, логирования и резервного копирования.

📅 30.06.2026 👁️ 293
📝

Пагинация в Django ListView

Охватываемые темы: Включение пагинации, Шаблон с пагинацией, Пагинация с фильтрами, Ручная пагинация (в function-based views).

📅 30.06.2026 👁️ 353

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!