跳转至

REST framework入坑(8)-DRF中的七个子类

ListModelMixin

  • 列表视图扩展类, 提供list(request, args, *kwargs)方法快速实现列表视图, 返回200状态码
  • 该Mixin的list方法会对数据进行过滤和分页
  • 源码
class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        # 过滤
        queryset = self.filter_queryset(self.get_queryset())
        # 分页
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        # 序列化
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
  • Demo
from rest_framework.mixins import ListModelMixin
class StudentInfoListView(ListModelMixin, GenericAPIView):
    queryset = StudentInfo.objects.all() # 指定数据集
    serializer_class = StudentInfofoSerializer # 指定序列化器

    def get(self, request): # 重写get方法 返回封装好的 list方法
        return self.list(request) # 返回封装好的 list 方法

CreateModelMixin

  • 创建视图扩展类,提供create(request, args, *kwargs)方法快速实现创建资源的视图,成功返回201状态码。
  • 如果序列化器对前端发送的数据验证失败,返回400错误
  • 源码
class CreateModelMixin(object):
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        # 获取序列化器
        serializer = self.get_serializer(data=request.data)
        # 验证
        serializer.is_valid(raise_exception=True)
        # 保存
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}
  • Demo : 同上

RetrieveModelMixin

  • 详情视图扩展类,提供retrieve(request, args, *kwargs)方法,根据前端传进来的'PK'可以快速实现返回一个存在的数据对象。
  • 如果存在,返回200, 否则返回404
  • 源码
class RetrieveModelMixin(object):
    """
    Retrieve a model instance.
    """
    def retrieve(self, request, *args, **kwargs):
        # 获取对象,会检查对象的权限
        instance = self.get_object() # get_object快速根据前端传进来的pk得到一个数据库对象
        # 序列化
        serializer = self.get_serializer(instance)
        return Response(serializer.data)
  • Demo
class StudentInfoView(RetrieveModelMixin, GenericAPIView):
    queryset = StudentInfo.objects.all()
    serializer_class = StudentInfoSerializer

    def get(self, request, pk):
        return self.retrieve(request) # 调用父类封装好的方法即可

UpdateModelMixin

  • 更新视图扩展类,提供update(request, args, *kwargs)方法, 可以快速实现更新一个存在的数据对象
  • 同时也提供partial_update(request, args, *kwargs)方法, 可以实现局部更新。
  • 成功返回200, 序列化器校验数据失败时, 返回400错误
  • 源码
class UpdateModelMixin(object):
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        if getattr(instance, '_prefetched_objects_cache', None):
            instance._prefetched_objects_cache = {}
        return Response(serializer.data)
    def perform_update(self, serializer):
        serializer.save()
    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

DestroyModelMixin

  • 删除视图扩展类,提供destroy(request, args, *kwargs)方法,可以快速实现删除一个存在的数据对象。
  • 成功返回204,不存在返回404
  • 源码
class DestroyModelMixin(object):
    """
    Destroy a model instance.
    """
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)
    def perform_destroy(self, instance):
        instance.delete()

RetrieveUpdateAPIView

  • 继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

RetrieveUpdateDestoryAPIView

  • 继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin