视图组件
两个视图基类
APIView
# APIView 是rest-framwork提供的所有视图类的基类,它继承自django的View类
# 在APIView中仍然以常规的类视图定义方法来实现get()、post()...请求方式的方法
APIView和View的区别
- 传入到视图方法中的请求对象是rest-framwork的Reqeust类的对象,而不是django的HttpResponse类的对象
- APIView返回的是rest-framwork的Response类的对象,会响应前端要求的格式
- 会捕获全局异常,并且处理
- 在dispatch分发之前会进行三大认证
支持定义的类的属性
authentication_classes列表或元组(身份认证类)
permissoin_classes列表或元组(权限检查类)
throttle_classes列表或元组(流量/频率控制类)
GenericAPIView(通用视图类)
# GenericAPIView继承自APIView,主要增加了 操作序列化类对象 和 数据库查询 的方法,作用是为Mixin扩展类的执行提供方法支持,通常在使用时要搭配一个或多个Mixin扩展类
# 涉及到数据库操作,尽量选择GenericAPIView,以此减少代码量
提供的关于序列化器使用的属性与方法
- 属性
- seaializer_class:指定对应的序列化类
- 方法
- get_serializer_class(self)
- get_serializer(self, *args, **kwargs)
提供的关于数据库查询的属性与方法
- 属性
- queryset :查询的表名.objects.all() (这里不写all会自动添加上all,但推荐都写上)
- 方法
- get_queryset(self) :查所有
get_object(self) :查单条 不存在返回404
- get_queryset(self) :查所有
五个视图扩展类
# 这五个视图扩展类需要搭配GenericAPIView类使用,因为他们的功能的实现需要调用GenericAPIView提供的数据库查询方法和序列化类方法
# CreateModelMixin
内部有create方法 :新增
#ListModelMixin
内部有list方法 :查询所有
#DestroyModelMixin
内部有destroy方法 :删除单条
#UpdateModelMixin
内部有update方法 :修改一条
#RetrieveModelMixin
内部有retrieve方法 :查询单条
九个视图子类
ListAPIView
- list
CreateAPIView
- create
UpdateAPIView
- update
DestroyAPIView
- destroy
RetrieveAPIView
- retrieve
RetrieveUpdateDestroyAPIView
- retrieve+update+destroy
RetrieveDestroyAPIView
- retrieve+destroy
RetrieveUpdateAPIView
- retrieve+update
ListCreateAPIView
- list+create
视图集
ViewSetMixin
# 核心:重写了as_view方法
# 能够实现:请求方式和视图类中方法的映射
# 结论:只要继承ViewSetMixin的视图类,路由中as_view()里就要传action参数(字典)
例
path('books/', views.BookView.as_view({'get':'list','post':'create'}))
ViewSet
- 继承自APIView与ViewSetMixin,作用与APIView类似
- 主要通过ViewSetMixin重写的as_view,来完成调用as_view()时传入字典的映射处理
- 没有提供任何action方法,也就是视图类里的方法
- 需要自己编写list、retrieve、create、update、destroy等方法,如as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})
GeneriViewSet
- 继承自GenericAPIView与ViewSetMixin
- 实现了调用as_view()时传入字典的映射处理
- 提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用
ModelViewSet
- 继承自GenericAPIView和五个视图扩展类
ReadOnlyModelViewSet
- 继承自GenericAPIView和ListModelMixin、RetrieveModelMixin
如何选择视图类
APIView
- 无需序列化类
- 不与数据库打交道
- 如:发送短信接口,发送邮件接口
GenericAPIView
- 需要序列化类
- 与数据库打交道
- 如:登录注册接口
五个视图拓展类(必须配合GenericAPIView)
- 适用于五个常见的增删改查
九个视图子类
- 如果要写五个接口之一或者之多,直接使用它
ViewSet
- 需要自动生成路由,或者想要路由映射
- 不与数据库打交道
- 不需要序列化类
GenericViewSet
- 需要自动生成路由,或者想要路由映射
- 与数据库打交道
- 需要序列化类
- 如 登录注册
ModelViewSet
- 五个接口都要写
- 需要自动生成路由