首页 > 其他分享 >drf05-2个视图基类-5个扩展类-9个视图子类-视图集

drf05-2个视图基类-5个扩展类-9个视图子类-视图集

时间:2022-10-07 15:13:20浏览次数:47  
标签:return ser get 子类 self request 视图 基类

1.2两个视图基类

#之前写了五个接口,继承APIView
#还可以继承GenericApiView:它帮了我们干很多事
#GeneriaAPIView.属性和方法
-属性
	-queryset     #要序列化的数据
	-serializer_class #序列化类
	--------了解--------------
	----lookup_field #通过get_object 获取单个对象的查询key值,value是路由中穿过来的
	--filter_backends #过滤类
	-pagination_class #分页类
	
-方法
	-get_queryset    #获取要序列化的数据
	-get_object      #根据lookup_field 配置参数获取单个对象
	-get_serializer   #获取序列化类,咱直接用的
	-get_serializer_class #获取序列化类,不是咱们直接用get_serializer调用了它

---了解-------
-filter_queryset    #跟过滤有关系
-paginate_xxx      #跟分页有关

1.1基于APIView写五个接口

class UserView(APIView):
	def  get(self,request):
	res_list =User.object.all()
	ser = UserSerializer(instance=res_list,many=True)
	return Response(ser.data)
def  post(self,request):
	ser = UserSerlizer(data =request.data)
	if ser.is_valid():
	    ser.save()
	    return Response({'code':100,'msg':"新增成功"},status=201)
	else:
	    return Response({'code':101,'msg':ser.error})
        
    class UserDetailView(APIView):
    	def get(self,request,pk):
    	         obj = User.objects.filter(pk=pk).first()
    	         ser = UserSerializer(instance=obj)
    	         return Response(ser.data)
    	def put(self,request,pk):
    		obj = User.objects.filter(pk=pk).first()
    		ser = UserSerializer(instance=obj,data=request.data)
    		if ser.is_valid(): 
    		ser.save()
    		return Response({'code':'101','msg':"修改成功"},status=201)
    	else:
    		return  Response({'code':101,'msg':ser.errors})	
            def delete(self,request,pk):
                  User.objects.filter(pk=pk).delete()
                  return Response('')

1.2 基于GenericAPIView写五个接口

class UserView(GenericAPIView):
#配置两关类属性
queryset =User.object.all()
serializer_class = UserSerializer
def get(self,request):
	res_list = self.get_queryset()
request Response(ser,data)

def post(self,request):
	ser = self.get_serilizer(data=request.data)
	if ser.is_valid()
    	  ser.save()
	      return Response({'code':100,'msg':'新增成功'},status=201)
	else:
	      return Response({'code':101,'msg':ser.errors})
 class UserDetailView(GenericAPIView):
 	queryset = User.objects.all()
 	serilizer_class = UserSerlizer
 	
 	def get(self,request,pk):
 		obj = self.get_object()
 		ser = self.get_serializer(instance=obj)
 		return Response(ser.data)
 		
 	def put(self,request,pk):
 		obj = self.get_object()
 		ser =self.get_serilizer(instance=obj,data=request.data)
 		if ser.is_valid():
 		    ser.save()
 		    return Response({'code':100,'msg':"修改成功"},status=201)
 		else:
 		    return Response({'code':101,'msg':ser.errors})
 		    
 	def delete(self,request,pk):
 		self.get_queryset().filter(pk=pk).delete()
 		reutn Response('')

5个视图扩展类

基于GenericAPIView+5个试图扩展类写接口、

必须配合GenericAPIView使用,不能配合APIView使用

from rest_framework.minins import RetrieveModelMin,CreateModelMixin,updateModeMinxin,DestoryModeMixin,ListModeMixin
class UserView(GenericAPIView,ListModelMinxin,CreateModelMinxin):
	queryset = User.objects.all()
	serializer_class = UserSerilizer
	
	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,UpdateModelMinin,DestroyModelmixin)
	queryset =  User.object.all()
	serializer_class = UserSerializer
	
	def get(self,request,*args,**kwargs):
		return self.retrieve(request,*args,**kwargs)
		
	def put(self,request,*args,**kwargs):
		return self.retrieve(request,*args,**kwargs)	
	
	def delete(self,request,*args,**kwargs):
		return self.destroy(request,*arkgs,**kwargs)

9个视图子类

视图类:继承GenericAPIView+ 某个或者某几个视图扩展类

from  rest_framework.generics import ListAPIView,CreateAPIView,RetrieveAPIView,DestroyAPIView,UpdateAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveUPdateDestroyAPIView,RetrieveUPdateAPIView,RetrieveDestroyAPIView
#正常来说,Destroy + Update 应该又一个,作者没加
class  UserView(ListCreateAPIView):
#	配置两关类属性
	queryset = User.objects.all()
	
	serilizer_class = UserSerializer
	
class UserDetailView(RetrieveUpdateDestroyAPIView):
	queryset = User.objects.all()
	serializer_class = UserSerializer

视图集

继承ModelViewSet编写五个接口

#视图类
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet

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'}))

源码分析ViewSetMixin

@classonlymethod
def as_view(cls, actions=None, **initkwargs):
    # 路由中as_view中必须传参数,必须传字典:{'get': 'list', 'post': 'create'}
    if not actions: 
        raise TypeError("The `actions` argument must be provided when "
                        "calling `.as_view()` on a ViewSet. For example "
                        "`.as_view({'get': 'list'})`")
	# 路由匹配成功,执行view(request),request是老的request
    def view(request, *args, **kwargs):
	    # actions={'get': 'list', 'post': 'create'}
        for method, action in actions.items():
            # method:get      action:list
            # self 是视图类的对象中通过反射,查找list,
            # handler视图类中的list方法
            handler = getattr(self, action)
            # 向视图类的对象中,反射 method:get,handler:list方法
            # self.get=list
            setattr(self, method, handler)
        return self.dispatch(request, *args, **kwargs)
    return csrf_exempt(view)


# 只要继承了ViewSetMixin,以后路由写法变量,都要协程:views.UserView.as_view({'get': 'list', 'post': 'create'}))
# 这样写好以后,对应的请求方式来了,就会执行配置的方法


# 扩展:
	-以后只要继承了ViewSetMixin,视图类中可以写任意名字的方法,不用非得写get,post,delete

总结

-APIView:as_view,dispatch
    -GenericAPIView:继承了APIView
    	-类属性
        -方法
    -5个视图扩展类:RetrieveModelMixin, CreateModelMixin, UpdateModelMixin,DestroyModelMixin, ListModelMixin
    	-每个类里面有一个方法
    -9个视图子类:5个视图扩展类+GenericAPIView的组合
    -视图集:
    	-ViewSetMixin:魔法,重写了as_view,只要继承他,路由写法就变了
        -ViewSet:ViewSetMixin+APIView
        -GenericViewSet:ViewSetMixin+GenericAPIView
        -ModelViewSet:5个视图扩展类+GenericViewSet
        ReadOnlyModelViewSet:2个视图扩展类+GenericViewSet

标签:return,ser,get,子类,self,request,视图,基类
From: https://www.cnblogs.com/zongliang-ya/p/16759758.html

相关文章

  • drf视图基类,视图扩展类和视图子类
    两个视图基类GenericAPIView属性: queryset#要序列化的数据 serializer_class#序列化类#了解lookup_field#通过get_object......
  • Flask学习笔记(十)-标准类视图及使用场景
    一、定义规则1.标准类视图,必须继承自`flask.views.View`.2.必须实现`dipatch_request`方法,以后请求过来后,都会执行这个方法。这个方法的返回值就相当于是之前的函数视图......
  • 模板基类与正确的派生类函数调用--Effective C++ Item 43
    问题描述假设我们有这样一个业务场景,我们管理着许多公司,每个公司都有一个自己的许多日志信息需要处理,于是为了方便,我们写了一个模板类用来处理这些公司的信息,并且将这些公......
  • 两个视图基类,五个视图扩展类
    两个视图基类五个视图扩展类两个视图基类#之前写5个接口,继承APIView#还可以继承GenericAPIView:它帮我们干了好多事#GenericAPIView:属性和方法 -属性......
  • 物化视图概述
    物化视图是预先存储或“物化”为模式对象的查询结果。查询的FROM子句可以命名表、视图或物化视图。物化视图通常在复制中充当主表,在数据仓库中充当事实表。物化视图汇总、......
  • IDEA 项目视图保存节点展开状态
    没兴趣看过程的,请直接跳转到「解决方案」部分。问题现象IDEA折叠再展开之后,之前展开的状态就没有了(若gif未自动播放,可在新标签页打开):不像Eclipse可以保存展开状......
  • java子类对父类继承的属性在不同修饰词下的访问权限
    父类中的属性和方法可以被子类继承子类中继承了父类中的属性和方法后,在子类中能不能直接使用这些属性和方法:和这些属性和方法原有的修饰符(publicprotecteddefaultpri......
  • 计算机视觉与图形学-神经渲染专题-动态场景下的时序视图合成
    在低计算设备上渲染高帧速率视频的问题可以通过定期预测未来帧来解决,以增强虚拟现实应用程序中的用户体验。这是通过时间视图合成(TVS)问题来研究的,其目标是在给定前一帧以及......
  • MYSQL学习之视图
    (一)什么是视图??  视图就是站在不同的角度取看待同一份数据。(二)基本操作表复制:mysql>createtabledept2asselect*fromdept;#复制mysql>createtablescholar1assel......
  • 视图解析器
    <!--视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前缀--><prop......