Django
Beginner
1 min read
APIView and Generic Views in DRF
Example
# blog/api/views.py — APIView and generic views
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, generics, permissions
from ..models import Post
from ..serializers import PostSerializer
# --- Low-level APIView ---
class PostListAPIView(APIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def get(self, request):
posts = Post.published.select_related('author').order_by('-published_at')
serializer = PostSerializer(posts, many=True, context={'request': request})
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.data, context={'request': request})
if serializer.is_valid():
serializer.save(author=request.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# --- Generic views (preferred) ---
class PostListCreateView(generics.ListCreateAPIView):
queryset = Post.published.select_related('author')
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(author=self.request.user)
class PostRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.published.all()
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_update(self, serializer):
serializer.save(author=self.request.user)
Related Resources
Django Reference
Complete tag & property list
Django How-To Guides
Step-by-step practical guides
Django Exercises
Practice what you've learned
More in Django