CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-djangorestframework

Web APIs for Django, made easy.

Pending
Overview
Eval results
Files

generic-views.mddocs/

Generic Views and Mixins

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.

Capabilities

Generic API View Base

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
        """

Single Object Generic Views

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
        """

List Generic Views

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
        """

Combined Generic Views

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."""

Model Mixins

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()

Usage Examples

Simple Generic Views

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)

Custom Generic View with Filtering

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 queryset

Using Mixins to Build Custom Views

from 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)

Utility Functions

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

docs

auth-permissions.md

content-negotiation.md

decorators.md

fields-validation.md

generic-views.md

index.md

pagination-filtering.md

request-response.md

routers-urls.md

serializers.md

status-exceptions.md

testing.md

views-viewsets.md

tile.json