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

2020-07-13  本文已影响0人  是立品啊

ListModelMixin

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

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

  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

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

上一篇 下一篇

猜你喜欢

热点阅读