Django-RestFramework- 类视图(八)

1、APIView

  • 继承Django中的View
  • APIView与View的不同之处
    • 传入到视图方法中的是Resquest对象,而不是Django的HTTPRequest对象
    • 视图方法可以返回Response对象,会为响应数据处理(render)为符合前端的数据
    • 任何APIException异常都会被捕获到,并且处理成核实的响应信息
    • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流浪控制
  • 常用类属性
    • authentication_classes 列表或元组,身份认证类
    • permission_class  列表或元组,权限检查类
    • throttle_classes  列表或元组,流量控制类

2、GenericAPIView

  • 继承APIView
  • 支持的类方法
    • get_seriaizer  获取序列器类对象
    • get_queryset  返回视图使用的查询集对象
    • filter_queryset  返回排序后的过滤查询集对象 
    • get_object  返回详细视图所需的模型类对象
    • paginate_queryset  返回分页后的查询集

 

  • 支持的类属性
    • 必须指定的属性
      • queryset 指定需要使用的查询集
      • serializer_class  指定需要使用的序列化器
      • look_field 属性修改组件路由名称
      • filter_backends 指定过滤引擎     
class ProjectsList(GenericAPIView):
  
  #1、必须指定queryset和serializer_class
  # queryset指定需要使用的查询集
  queryset = Projects.objects.all()
  # serializer_class指定需要使用的序列化器
  serializer_class = ProjectsModelSerializer
  lookup_field = 'id'
  
  #2、排序
  #在视图类中指定过滤引擎
  filter_backends = [filters.OrderingFilter]
  #指定需要排序的字段
  ordering_fields = ['name', 'leader']
  • 过滤
      • filter_backends
      • ordering_fields

      #使用开源的过滤引擎

from django_filters.rest_framework import DjangoFilterBackend

      #a 在视图类中指定过滤引擎,也可以在全局中指定   

#在视图类中指定过滤引擎
 filter_backends = [filters.OrderingFilter]
#指定需要过滤的字段
filterset_fields=['name', 'tester']

      #b在setting.py文件中指定过滤引擎

INSTALLED_APPS = [
    'django_filters']
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.backends.DjangoFilterBackend'],
}
    • 排序
      • filter_backends
      • ordering_backends

      #a 在视图类中指定过滤引擎和排序字段

from rest_framework import  filters
#在视图类中指定过滤引擎
filter_backends = [filters.OrderingFilter]
#指定需要排序的字段
ordering_fields = ['name', 'leader']

      #b  在setting.py中指定过滤引擎后,在视图类中只需要指定排序字段ordering_fields

REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter',
    'django_filters.rest_framework.backends.DjangoFilterBackend'],
}
    • 分页
      • pagination_class

        #在全局setting.py文件中指定分页引擎

        

REST_FRAMEWORK = {
        # 在全局指定分页引擎
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 3,}
      • 或者自定义分页方式    
from rest_framework.pagination import PageNumberPagination
class PageNumberPaginationManual(PageNumberPagination):
  page_query_param = 'p'
  page_size = 5
  max_page_size = 10

        全局setting.py文件指定自定义的分页引擎  

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'utils.pagination.PageNumberPaginationManual',
}

 get方法修改如下:

  def get(self, request):
    #使用get_queryset方法获取查询集
    projects_qs = self.get_queryset()
    # #使用filter_queryset过滤查询集
    projects_qs = self.filter_queryset(projects_qs)
    page = self.paginate_queryset(projects_qs)
    if page:
      serializer = self.get_serializer(instance=page, many=True)
      return self.get_paginated_response(serializer.data)
    serializer = self.get_serializer(instance=projects_qs, many=True)
    return Response(serializer.data)

继承GenericAPIView后的代码优化如下:projects/views.py

3、Mixin

  • RetrieveModelMixin
    • 提供retrieve( request, *args, **kwargs)方法:
    • 获取已存在的详情数据(一条记录)
    • 获取成功则返回200ok
    • 如果不存在,则返回404 NOT found
        
  • UpdateModelMixin
    • 提供update( request, *args, **kwargs)方法,用于全更新
    • 提供partial_update(self, request, *args, **kwargs)方法,用于部分更新,
    • 更新已存在的模型实例(更新一条记录)
    • 更新成功则返回200 OK
    • 如果请求参数错误,则返回 400 BAD REQUEST
    • 如果不存在,则返回404 NOT FOUND
  • DestroyModelMixin
    • 提供destory( request, *args, **kwargs)方法
    • 删除一条已存在的数据(删除一条记录)
    • 删除成功则返回204 NO CONTENT
    • 如果不存在则返回404 NOT FOUND
  • ListModelMixin
    • 提供list( request, *args, **kwargs)方法
    • 获取已存在的列表数据(多条记录)
    • 获取成功,返回200 OK
  • CreateModelMixin
    • 提供create( request, *args, **kwargs)方法
    • 创建新的模型实例(创建新的记录)
    • 创建成功,返回201 Created
    • 如果请求参数错误,则返回 400 BAD REQUEST

4、Concrete generic Views

  • RetrieveAPIView
    • 提供get方法
    • 继承:RetrieveModelMixin, GenericAPIView
  • CreateAPIView  
    • 提供post方法
    • 继承:CreateModelMixin,GenericAPIView
  • ListAPIView
    • 提供get方法
    • 继承:ListModelMixin,GenericAPIView
  • DestroyAPIView
    • 提供delete方法
    • 继承:DestroyModelMixin,GenericAPIView
  • UpdateAPIView
    • 提供put,patch方法
    • 继承:UpdateModelMixin,GenericAPIView
  • ListCreateAPIView
    • 提供get,post方法
    • 继承:ListModelMixin,CreateModelMixin,GenericAPIView
  • RetrieveUpdateAPIView
    • 提供get,put,patch方法
    • 继承:RetrieveModelMixin,UpdateModelMixin,GenericAPIView
  • RetrieveDestroyAPIView
    • 提供get,delete方法
    • 继承:RetrieveModelMixin,DestroyModelMixin,GenericAPIView
  • RetrieveUpdateDestroyAPIView
    • 提供get,put,patch,delete方法
    • 继承:RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin,GenericAPIView

5、ViewSet

  • ViewSetMixin:重写as_view(),通过action关键字执行绑定的http方法,也就是行为映射方法。

      view = MyViewSet.as_view({'get': 'list', 'post': 'create'})

    • ViewSet类:继承ViewSetMixin,views.APIView
      • ViewSetMixin支持action动作,不支持get,put,delete等方法
      • 不支持get_object(),get_serializer(),queryset,serializer_class等

GenericViewSet:

    继承ViewSetMixin和generics.GenericAPIView
    • ViewSetMixin支持action动作
    • 但是有GenericAPIView的所有方法和属性:get_object(),get_serializer(),queryset,serializer_class等
  • ReadOnlyModelViewSet:继承RetrieveModelMixin,ListModelMixin,GenericViewSet
    • 提供了list(),retrieve()的行为的视图集
  • ModelViewSet:继承CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,ListModelMixin,GenericViewSet
    • A viewset that provides default `create()`, `retrieve()`, `update()`,`partial_update()`, `destroy()` and `list()` actions.
    • 包含了以上行为的视图集
请求方法 动作 描述
GET list 获取列表数据(多条)
GET retrieve 获取详情数据(单条)
POST create 创建数据
PUT update 更新数据
PATCH partial_update 部分更新
DELETE destroy 删除数据

 

6、action

7、router

 

    

  

  

posted @ 2020-01-12 09:36  sinder2018  阅读(51)  评论(0)    收藏  举报