Views & Routing
ModelViewSet (Full CRUD)
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
APIView (Manual Control)
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class PostList(APIView):
def get(self, request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Generic Views
from rest_framework import generics
class PostListCreate(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
Custom Actions in ViewSet
from rest_framework.decorators import action
class PostViewSet(viewsets.ModelViewSet):
@action(detail=True, methods=['post'])
def publish(self, request, pk=None):
post = self.get_object()
post.publish()
return Response({'status': 'published'})
Default Router
from rest_framework.routers import DefaultRouter
from .views import PostViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet, basename='post')
urlpatterns = [
path('', include(router.urls)),
]
Manual URL Patterns
urlpatterns = [
path('posts/', views.PostList.as_view()),
path('posts/<int:pk>/', views.PostDetail.as_view()),
]
Dynamic Serializer Class
class PostViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if self.action == 'list':
return PostListSerializer
return PostDetailSerializer