9.30内容整理和概述
今日内容概要
内容目录
- 2 个视图基类
- 5个视图扩展类+例子
- 9个视图子类
- 视图集
2 个视图基类
'-------------APIView---------------' # 第一层封装
特点:
1.继承于View类
2.取消了csrf认证
3.封装了新的request,执行了认证,频率,权限
4.全局捕获异常
'-------------GenericAPIView---------------' # 第二层封装
特点:
1.继承于APIView类,包含APIView类所有功能
2.引入了几个重要参数,获取当前类的数据,序列化类等信息,方便后续方法调用,简化代码,提高效率
3.引入了几个方法,提高扩展性
5个视图扩展类
特点: # 第三层封装
1.没有继承视图类(View/APIView/GenericAPIView)
2.只是封装视图类中的五个方法为方法类,命名视图扩展类
3.需要配合GenericAPIView类同时使用
4.任需写五大方法函数
导包:
from rest_framework.mixins import RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, ListModelMixin
'-------------CreateModelMixin---------------' # 对应post请求功能
特点:
1.当前类编写了Create方法,实现创建单条数据的功能
2.返回创建的数据,状态码,请求头
'-------------RetrieveModelMixin---------------' # 对应get请求功能
特点:
1.当前类编写了retrieve方法,实现获取单条数据的功能
2.返回查询的数据
'-------------UpdateModelMixin---------------' # 对应put请求功能
特点:
1.当前类编写了update方法,实现修改单条数据的功能
2.返回修改好的数据
3.里面还有partial_update方法,实现局部更新
'-------------ListModelMixin---------------' # 对应get请求功能
特点:
1.当前类编写了list方法,实现获取多条数据的功能
2.返回查询的数据
'-------------DestroyModelMixin---------------' # 对应delete请求功能
特点:
1.当前类编写了destroy方法,实现删除单条数据的功能
2.返回状态码
5个视图扩展类例子
class UserView(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class UserDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self,request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args,**kwargs):
return self.update(request,*args,**kwargs)
def delete(self, request, *args,**kwargs):
return self.destroy(request,*args,**kwargs)
9个视图子类
特点: # 第四层
1.这9个视图子类都是由视图扩展类和GenericAPIView类两个或三个组合而成 # python支持多继承
2.继承视图子类的类实现对应功能可以不写方法函数 # 也可以写,支持派生
3.继承视图子类的视图类只需要编写queryset和serializer_class参数
导包:
from rest_framework.generics import ListAPIView,CreateAPIView,ListCreateAPIView, RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
组合原则:含多个视图扩展类时,视图扩展类得属于一种类的方法对应
两两组合:
'-------------ListAPIView---------------'
特点:
1.由ListModelMixi视图扩展类 + GenericAPIView视图基类组成
2.类内部写了get函数,调用了list方法,并将结果返回
相似视图子类:
'-------------CreateAPIView---------------'
'-------------RetrieveAPIView---------------'
'-------------DestroyAPIView---------------'
'-------------UpdateAPIView---------------'
三/四个组合:
'-------------ListCreateAPIView---------------'
特点:
1.由ListModelMixi视图扩展类 + CreateModelMixin视图扩展类 + GenericAPIView视图基类组成
2.类内部写了get函数,调用了list方法,并将结果返回
3.类内部写了post函数,调用了create方法,并将结果返回
相似视图子类:
'-------------RetrieveUpdateAPIView---------------'
'-------------RetrieveDestroyAPIView---------------'
'-------------RetrieveUpdateDestroyAPIView---------------'
例子:
class UserView(ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetailView(RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
视图集
导包:from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet,ViewSetMixin,ViewSet,GenericSetMixin
'-------------ModelViewSet---------------'
特点:
1.一次性封装五个接口,只需配置queryset和serializer_class参数
2.需要修改路由,做方法映射
1.在as_view方法中添加映射字典
2.映射关系:'请求方法':'功能实现方法'
3.组成:5个视图扩展类+GenericAPIView
案例:
# 视图层
class UserView(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
# 路由层
path('user/', views.UserView.as_view({'get': 'list', 'post': 'create'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
'-------------ReadOnlyModelViewSet---------------'
特点:
1.只能实现读取数据,需配置queryset和serializer_class参数
2.需要修改路由,做方法映射
1.在as_view方法中添加映射字典
2.映射关系:'请求方法':'功能实现方法'
3.求他请求方式发来,报错
4.组成:2个读取数据的视图扩展类+GenericAPIView
案例:
# 视图层
class UserView(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
# 路由层
path('user/', views.UserView.as_view({'get': 'list'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve'}),
'-------------ViewSetMixin---------------'
特点:
1.此类修改了路由方式,路由匹配成功,执行ViewSetMixin类中的as_view方法,而不是APIView的as_view方法
2.as_view方法参数为空则报错
drf源码:
if not actions:
raise TypeError("The `actions` argument must be provided when "
"calling `.as_view()` on a ViewSet. For example "
"`.as_view({'get': 'list'})`")
3.主要运行源码的view函数:通过反射投影方法,同时取消csrf
drf源码:
def view(request, *args, **kwargs):
for method, action in actions.items():
handler = getattr(self, action)
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
4.此类不为视图类,必须搭配视图类
5.支持了视图类自定义方法,做好路由as_view方法映射就行
'-------------ViewSet---------------'
特点:
1.由ViewSetMixin + APIView组成
'-------------GenericAPIView---------------'
特点:
1.由ViewSetMixin + GenericAPIView组成 # 继承顺序很重要