美文网首页
DRF使用篇(八):通用视图

DRF使用篇(八):通用视图

作者: 是立品啊 | 来源:发表于2020-07-13 22:01 被阅读0次

ListModelMixin

  • 列表视图扩展类, 提供list(request, *args, **kwargs)方法快速实现列表视图, 返回200状态码

  • Mixinlist方法会对数据进行过滤和分页

  • 源码

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 {}

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

继承自: GenericAPIViewRetrieveModelMixinUpdateModelMixin

RetrieveUpdateDestoryAPIView

继承自:GenericAPIViewRetrieveModelMixinUpdateModelMixinDestoryModelMixin

相关文章

网友评论

      本文标题:DRF使用篇(八):通用视图

      本文链接:https://www.haomeiwen.com/subject/mkzzcktx.html