ViewSets group related views. Routers auto-generate URL patterns.
1from rest_framework import viewsets, status2from rest_framework.decorators import action3from rest_framework.response import Response4from .models import User5from .serializers import UserSerializer67# ViewSet — CRUD in one class8class UserViewSet(viewsets.ModelViewSet):9 queryset = User.objects.all()10 serializer_class = UserSerializer1112 # Custom action13 @action(detail=False, methods=["get"])14 def me(self, request):15 serializer = self.get_serializer(request.user)16 return Response(serializer.data)1718 @action(detail=True, methods=["post"])19 def follow(self, request, pk=None):20 user_to_follow = self.get_object()21 request.user.following.add(user_to_follow)22 return Response({"status": "followed"})2324# Router — auto URL generation25from rest_framework.routers import DefaultRouter2627router = DefaultRouter()28router.register(r"users", UserViewSet)29router.register(r"posts", PostViewSet)3031# Generated URLs:32# GET /users/ — list33# POST /users/ — create34# GET /users/{id}/ — retrieve35# PUT /users/{id}/ — update36# PATCH /users/{id}/ — partial update37# DELETE /users/{id}/ — destroy38# GET /users/me/ — custom action39# POST /users/{id}/follow/ — custom action4041# In urls.py42urlpatterns = [43 path("", include(router.urls)),44]4546# ReadOnlyViewSet — only list and retrieve47class TagViewSet(viewsets.ReadOnlyModelViewSet):48 queryset = Tag.objects.all()49 serializer_class = TagSerializer
ViewSet actions:
list — GET all.create — POST.retrieve — GET one.update — PUT.destroy — DELETE.