📝 Django

DRF ViewSets and Routers

P
Author
Pyland
📅
Published
30.06.2026
⏱️
Reading time
1 min
👁️
Views
73
🌳
Level
Advanced

ViewSet is a class that combines several related views into one. Router automatically generates URLs.

ModelViewSet — Full 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]

Automatically creates:

Method URL Action
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)),
]

Custom Actions (@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)

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

ReadOnlyModelViewSet

from rest_framework import viewsets

class CategoryViewSet(viewsets.ReadOnlyModelViewSet):
    """GET requests only — list and retrieve."""
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

pytest-django: Testing Django

Охватываемые темы: Installation, @pytest.mark.djangodb, Fixtures, Testing views.

📅 30.06.2026 👁️ 132
📝

Django: Template Tags

Template tags are logic inside HTML. Unlike {{ variable }} which only outputs a value,...

📅 30.06.2026 👁️ 84
📝

HTML Lists

Lists are one of the most common markup elements. Navigation menus, post tags, how-to steps,...

📅 30.06.2026 👁️ 84

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!