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

浙公网安备 33010602011771号