Web APIs for Django, made easy.
—
Pre-built generic views and mixins for common API patterns. Provides CRUD operations, pagination, and filtering with minimal code by combining the power of Django's class-based views with DRF's API functionality.
Base class for all generic views providing common functionality.
class GenericAPIView(APIView):
"""
Base class for generic views with queryset and serializer support.
"""
queryset = None # Base queryset for the view
serializer_class = None # Serializer class to use
lookup_field = 'pk' # Field for object lookup
lookup_url_kwarg = None # URL kwarg for lookup
filter_backends = [] # List of filter backend classes
pagination_class = None # Pagination class
def get_queryset(self):
"""
Get the queryset for this view.
Returns:
QuerySet: Filtered queryset
"""
def get_object(self):
"""
Get single object based on lookup parameters.
Returns:
Model instance
Raises:
Http404: If object not found
"""
def get_serializer(self, *args, **kwargs):
"""
Get serializer instance with current context.
Returns:
Serializer: Configured serializer instance
"""
def get_serializer_class(self):
"""
Get serializer class for this view.
Returns:
Serializer class
"""
def paginate_queryset(self, queryset):
"""
Paginate queryset if pagination is configured.
Args:
queryset: QuerySet to paginate
Returns:
list or None: Paginated results
"""
def filter_queryset(self, queryset):
"""
Apply filtering backends to queryset.
Args:
queryset: Base queryset
Returns:
QuerySet: Filtered queryset
"""Views for operations on individual objects.
class CreateAPIView(GenericAPIView):
"""
Concrete view for creating model instances.
"""
def post(self, request, *args, **kwargs):
"""
Handle POST requests to create new objects.
Returns:
Response: 201 Created with serialized data
"""
class RetrieveAPIView(GenericAPIView):
"""
Concrete view for retrieving model instances.
"""
def get(self, request, *args, **kwargs):
"""
Handle GET requests to retrieve single object.
Returns:
Response: 200 OK with serialized data
"""
class UpdateAPIView(GenericAPIView):
"""
Concrete view for updating model instances.
"""
def put(self, request, *args, **kwargs):
"""
Handle PUT requests for full object updates.
Returns:
Response: 200 OK with updated serialized data
"""
def patch(self, request, *args, **kwargs):
"""
Handle PATCH requests for partial object updates.
Returns:
Response: 200 OK with updated serialized data
"""
class DestroyAPIView(GenericAPIView):
"""
Concrete view for deleting model instances.
"""
def delete(self, request, *args, **kwargs):
"""
Handle DELETE requests to destroy objects.
Returns:
Response: 204 No Content
"""Views for operations on collections of objects.
class ListAPIView(GenericAPIView):
"""
Concrete view for listing model instances.
"""
def get(self, request, *args, **kwargs):
"""
Handle GET requests to list objects with pagination and filtering.
Returns:
Response: 200 OK with serialized data list
"""Views that combine multiple operations for convenience.
class ListCreateAPIView(GenericAPIView):
"""
Concrete view for listing and creating model instances.
"""
def get(self, request, *args, **kwargs):
"""List objects."""
def post(self, request, *args, **kwargs):
"""Create new object."""
class RetrieveUpdateAPIView(GenericAPIView):
"""
Concrete view for retrieving and updating model instances.
"""
def get(self, request, *args, **kwargs):
"""Retrieve object."""
def put(self, request, *args, **kwargs):
"""Update object (full)."""
def patch(self, request, *args, **kwargs):
"""Update object (partial)."""
class RetrieveDestroyAPIView(GenericAPIView):
"""
Concrete view for retrieving and deleting model instances.
"""
def get(self, request, *args, **kwargs):
"""Retrieve object."""
def delete(self, request, *args, **kwargs):
"""Delete object."""
class RetrieveUpdateDestroyAPIView(GenericAPIView):
"""
Concrete view for retrieving, updating, and deleting model instances.
"""
def get(self, request, *args, **kwargs):
"""Retrieve object."""
def put(self, request, *args, **kwargs):
"""Update object (full)."""
def patch(self, request, *args, **kwargs):
"""Update object (partial)."""
def delete(self, request, *args, **kwargs):
"""Delete object."""Modular functionality that can be mixed into views.
class CreateModelMixin:
"""
Provide create functionality for views.
"""
def create(self, request, *args, **kwargs):
"""
Create new model instance.
Returns:
Response: 201 Created with serialized data
"""
def perform_create(self, serializer):
"""
Save the object during creation.
Args:
serializer: Validated serializer instance
"""
serializer.save()
def get_success_headers(self, data):
"""
Get headers for successful creation response.
Args:
data: Serialized object data
Returns:
dict: Response headers
"""
class ListModelMixin:
"""
Provide list functionality for views.
"""
def list(self, request, *args, **kwargs):
"""
List model instances with pagination and filtering.
Returns:
Response: 200 OK with serialized data list
"""
class RetrieveModelMixin:
"""
Provide retrieve functionality for views.
"""
def retrieve(self, request, *args, **kwargs):
"""
Retrieve single model instance.
Returns:
Response: 200 OK with serialized data
"""
class UpdateModelMixin:
"""
Provide update functionality for views.
"""
def update(self, request, *args, **kwargs):
"""
Update model instance (full update).
Returns:
Response: 200 OK with serialized data
"""
def partial_update(self, request, *args, **kwargs):
"""
Partially update model instance.
Returns:
Response: 200 OK with serialized data
"""
def perform_update(self, serializer):
"""
Save the object during update.
Args:
serializer: Validated serializer instance
"""
serializer.save()
class DestroyModelMixin:
"""
Provide destroy functionality for views.
"""
def destroy(self, request, *args, **kwargs):
"""
Delete model instance.
Returns:
Response: 204 No Content
"""
def perform_destroy(self, instance):
"""
Delete the object.
Args:
instance: Object instance to delete
"""
instance.delete()from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.permissions import IsAuthenticated
class BookListCreateView(ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
permission_classes = [IsAuthenticated]
def perform_create(self, serializer):
# Automatically set owner to current user
serializer.save(owner=self.request.user)
class BookDetailView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
permission_classes = [IsAuthenticated]
def perform_update(self, serializer):
# Custom logic during update
serializer.save(last_modified_by=self.request.user)from rest_framework.generics import ListAPIView
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
class BookListView(ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ['genre', 'publication_year']
search_fields = ['title', 'author__name']
ordering_fields = ['title', 'publication_date']
ordering = ['-publication_date']
def get_queryset(self):
# Custom queryset filtering
queryset = super().get_queryset()
author = self.request.query_params.get('author')
if author:
queryset = queryset.filter(author__name__icontains=author)
return querysetfrom rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.generics import GenericAPIView
class CustomBookView(ListModelMixin, CreateModelMixin, GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
def perform_create(self, serializer):
# Custom creation logic
serializer.save(created_by=self.request.user)def get_object_or_404(queryset, *filter_args, **filter_kwargs):
"""
Get object from queryset or raise 404 error.
Args:
queryset: QuerySet to search
*filter_args: Filter arguments
**filter_kwargs: Filter keyword arguments
Returns:
Model instance
Raises:
Http404: If object not found
"""Install with Tessl CLI
npx tessl i tessl/pypi-djangorestframework