📝 Django

DRF ViewSets и Роутеры

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

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)

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

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

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

🔗 Похожие

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

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

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 132
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 84
📝

Списки в HTML

Список — один из самых частых элементов разметки. Навигационное меню, теги поста, шаги инструкции, глоссарий...

📅 30.06.2026 👁️ 84

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

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