Introduction to DRF
Django REST Framework (DRF) makes it easy to build Web APIs. It provides serializers, viewsets, and routers for quick API development.
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'title', 'content', 'author', 'created_at']
Serializers convert complex data types like querysets to JSON. They handle validation and data transformation.
ViewSets and Routers
ViewSets combine related views into a single class. Routers automatically generate URL patterns.
from rest_framework import viewsets
from rest_framework.routers import DefaultRouter
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
ModelViewSet provides list, create, retrieve, update, and destroy actions out of the box. Include the router URLs in your URLconf.
Using APIView
For more control, use APIView to write function-based or class-based views.
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class ArticleList(APIView):
def get(self, request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ArticleSerializer(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)
APIView gives you full control over request handling and response formatting.
Try it Yourself โAuthentication and Permissions
DRF provides authentication classes and permission classes to secure your API.
from rest_framework.permissions import IsAuthenticated, IsAdminUser
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = [IsAuthenticated]
Common permissions include IsAuthenticated, IsAdminUser, and AllowAny. You can combine multiple permissions with & or |.
Pagination and Filtering
DRF includes built-in pagination and filtering support.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20,
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}
Pagination breaks results into pages. Filtering lets users narrow down results with query parameters.