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)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!