视图介绍
作用
- 控制序列化器的执行(检验、保存、转换数据)
- 控制数据库查询的执行
- 简化视图的编写
两个视图基类
APIView
导入:from rest_framework.views import APIView
APIView
是REST framework
提供的所有视图的基类,继承了View
父类,对原生的request
对象进行了封装。并重写了dispatch
方法,对认证,权限,频率控制,并处理全局异常。
没有操作数据库,需要你自己去写get
、post
GenericAPIView
导入:from rest_framework.generics import GenericAPIView
GenericAPIView
继承了APIView
增加了序列化数据和序列化的类为Mixin
扩展类提供支持
常用属性
属性 | 作用 |
---|---|
queryset | 需要序列化的查询集 |
serializer_class | 指定使用的序列化器 |
pagination_class | 分页控制类 |
filter_backends | 过滤控制后端 |
lookup_field | 查询时的查询条件,默认为pk |
常用方法
方法 | 作用 |
---|---|
get_queryset() | 查询获取所有记录 |
get_object() | 获取一条数据对象 |
get_serializer() | 获取配置的序列化类 |
五个视图扩展类
扩展类 | 提供方法 | 用途 |
---|---|---|
ListModelMixin |
list() |
获取多条数据对象 |
CreateModelMixin |
create() |
新增单一数据对象 |
RetrieveModelMixin |
retrieve() |
获取单一数据对象 |
UpdateModelMixin |
update() |
更新一条数据对象 |
DestroyModelMixin |
destroy() |
删除一条数据对象 |
九个子类视图
子类 | 提供方法 | 继承自 |
---|---|---|
CreateAPIView |
提供 post 方法 |
GenericAPIView 、 CreateModelMixin |
ListAPIView |
提供 get 方法 |
GenericAPIView 、 ListModelMixin |
RetireveAPIView |
提供 get 方法 |
GenericAPIView 、 RetrieveModelMixin |
DestoryAPIView |
提供 delete 方法 |
GenericAPIView 、 DestoryModelMixin |
UpdateAPIView |
提供 put 和 patch 方法 |
GenericAPIView 、 UpdateModelMixin |
ListCreateAPIView |
提供 get 、 post 方法 |
GenericAPIView 、 ListModelMixin 、 CreateModelMixin |
RetrieveUpdateAPIView |
提供 get 、 put 、 patch 方法 |
GenericAPIView 、 RetrieveModelMixin 、 UpdateModelMixin |
RetrieveDestroyAPIView |
提供 get 、 put 、 patch 方法 |
GenericAPIView 、 RetrieveModelMixin 、 DestoryModelMixin |
RetrieveUpdateDestoryAPIView |
提供get 、 put 、 patch 、 delete 方法 |
GenericAPIView 、 RetrieveModelMixin 、 UpdateModelMixin 、 DestoryModelMixin |
ViewSet视图集
ViewSetMixin
ViewSetMixin
重写了as_view
,路由写法变了 eg:as_view({'get': 'list', 'post': 'create'})
# ViewSetMixin 源码分析
class ViewSetMixin:
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
# actions={'get': 'list', 'post': 'create'}
def view(request, *args, **kwargs):
# method:get action:list
for method, action in actions.items():
# handler就是list
handler = getattr(self, action) #视图类反射有没有list
# 反射:把list变成了get
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
ViewSet
继承 : APIView
、 ViewSetMixin
ViewSet
视图集类不再实现get()
、post()
等方法,而是实现动作action
如list()
、create()
等
视图集只在使用as_view()
方法的时候,才会将action
动作与具体请求方式对应上
GenericViewSet
继承:ViewSetMixin
、GenericAPIView
ReadOnlyModelViewSet
继承:RetrieveModelMixin
、ListModelMixin
、GenericViewSet
ModelViewSet
继承了五个视图扩展类