drf--视图类(2 个视图基类+5个视图扩展类+9个视图子类+视图集)

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组成		# 继承顺序很重要
posted @ 2023-04-19 23:41  维生素Z  阅读(8)  评论(0)    收藏  举报