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
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!