首页 > 其他分享 >2个视图基类,5个视图扩展类,9个视图子类,视图集,自动生成路由

2个视图基类,5个视图扩展类,9个视图子类,视图集,自动生成路由

时间:2023-05-22 20:23:47浏览次数:64  
标签:get 子类 self list request 视图 基类 路由

image
p.name改变的是p对象自己的属性所以
p.name = '彭于晏'
p1.name = lqz

1 5个视图扩展类

# 写5个类(不叫视图类,视图扩展类,需要配合GenericAPIView一起用),每个类有一个方法,以后想写哪个接口,就继承哪个类即可
from .models import Book
from .serializer import BookSerialzier
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView

from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, \
    RetrieveModelMixin

'''
    -查询所有 :ListModelMixin--->list方法
    -新增一条:CreateModelMixin---》create方法
    
    -查询单条:RetrieveModelMixin---》retrieve方法
    -修改一条:UpdateModelMixin---》update方法
    -删除一条:DestroyModelMixin---》destroy方法
'''
class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier

    def get(self, request):
        return self.list(request)

    def post(self, request):
        return self.create(request)



class BookDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier

    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)
		
		
# 5个视图扩展类--->不是视图类---》必须配合GenericAPIView及其子类使用---》不能配合APIView使用
# 5个视图扩展类,每一个类中只有一个方法,完成5个接口中的其中一个,想写多个接口,就要继承多个

2 9个视图子类

# ModelViewSet:
	-继承它后,只需要在视图类中写两行
    	queryset = Book.objects.all()
    	serializer_class = BookSerialzier
    -配置路由,5个接口都有了
    	path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
    	path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
        
        
        
# ModelViewSet 源码分析
	-继承了:      
    		mixins.CreateModelMixin,
             mixins.RetrieveModelMixin,
             mixins.UpdateModelMixin,
             mixins.DestroyModelMixin,
             mixins.ListModelMixin
             GenericViewSet
                -ViewSetMixin :没有见过,重写了 as_view
                -GenericAPIView
                
                
     #-只要继承了ModelViewSet,路由写法变了,谁控制它变的:ViewSetMixin
   

# ViewSetMixin 如何控制路由写法变了?
	-BookView.as_view 是在执行,其实是ViewSetMixin的as_view
        @classonlymethod
        def as_view(cls, actions=None, **initkwargs):
            #我们传入的 actions={'get': 'list', 'post': 'create'}
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)
                for method, action in actions.items():
                    # method:get
                    # action:list
                    # 通过反射,self是BookView的对象,取BookView对象中反射list
                    handler = getattr(self, action)
                    # 通过反射:setattr(BookView的对象,'get',list方法)
                    setattr(self, method, handler)
                    #self.method = self.action
                    #self.get = self.list
                # APIViwe的dispatch
                return self.dispatch(request, *args, **kwargs)
            return csrf_exempt(view)
	
    
    
# 总结:
	'''
	1 只要继承了ViewSetMixin及其子类,路由写法就变了,必须传actions参数
	2 变成映射关系了:
		path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
    3 以后,只要是books路由匹配成功,的get请求,就会执行视图类BookView的list方法
    
    4 以后视图类中的方法名,可以随意命名
    5 这个类,必须配合视图类使用(APIView,GenericAPIView,9个视图子类),必须放在视图类之前
	'''

3 视图集

3.1 总结

# 两个视图基类
	-APIView
    -GenericAPIView
# 5 个视图扩展类(不是视图类,需要配合GenericAPIView及其子类使用)
	
# 9个视图子类

# 视图集:
	ModelViewSet:5个接口的
    ReadOnlyModelViewSet:两个接口,list和retrieve
    ViewSetMixin:魔法,不能单独使用,必须配合视图类用,路由写法变了
    ViewSet:ViewSetMixin+APIView,以后想继承APIView,但是想路由写法变化,视图类中方法可以任意命名
    GenericViewSet:ViewSetMixin+GenericAPIView,以后想继承GenericAPIView,但是想路由写法变化,视图类中方法可以任意命名

4 drf之路由

# 路由写法有多种
	-原始写法
    -映射的写法:path('books/', BookView.as_view({'get': 'list', 'post': 'create'}))
    -自动生成路由
    
# 自动生成路由
	-必须要继承ViewSetMixin及其子类的视图类,才能用
    -继承了 5个视图扩展类+ViewSetMixin的视图类,能自动生成路由
    	-跟咱们写的这个是一样的
         -path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
   	     -path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
        
        
    -自己写的视图类的方法,如何映射
    	-映射的方式我们会
        -自动生成的方式
    	
        
        
        
# 自动生成路由
	1 继承了 5个视图扩展类+ViewSetMixin的视图类,能自动生成路由(get:list,get:retrieve..)
    2 我们自己命名的: 方法名:login  send_sms,需要使用装饰器来做
        # 视图类:
        class SMSView(ViewSet):
            @action(methods=['GET'], detail=False, url_path='lqz', url_name='lqz')
            def lqz(self, request):
        # 路由
        router.register('lqz',SMSView,'lqz') #前缀,视图类,别名
        # 路径是:http://127.0.0.1:8000/api/v1/lqz/lqz/
                                        第一个lqz是前缀,后面是url_path
        
   3 action装饰器的参数
	methods:请求方式
    detail:一个True,一个False,用True,表示生成详情的路径 <int:pk>
    	# True,books/1/方法名/
        # False,books/方法名/
    url_path:路径名字,需要加上前面的路径一起,如果不加,默认以函数名作为路径名
    url_name:反向解析使用的名字(用的不多)
    
    
    
    
 # 路由类,有两个,用法完全一致,区别是DefaultRouter生成的路径多
	SimpleRouter :用的最多
    DefaultRouter
    # DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

路由:
image
视图:
image

标签:get,子类,self,list,request,视图,基类,路由
From: https://www.cnblogs.com/whxx/p/17421630.html

相关文章

  • 两个视图基类GenericAPIView,APIView
    基于两个视图基类GenericAPIView,APIViewclassBookserializers(serializers.ModelSerializer):#name=serializers.CharField()#price=serializers.CharField()#publish_id=serializers.CharField(write_only=True)#Authors=serializers.ListFie......
  • MFC视图切换大全总结
    单纯视图之间的切换单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。在MFC创建SDI的伊......
  • mysql基础_视图
    介绍MySQL视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。优点定制用户数据,聚焦特定的数据简化数据操作提高数据的安全性共享所需数据......
  • 空基类优化(EBO)
    空基类优化基础为保证同一类型的不同对象地址始终不同,要求任何对象或成员子对象的大小至少为1个字节,即使这个类为一个空类。structA{};//只包含类型成员、非虚函数或静态成员变量intmain(){DBG_LOG("......
  • 专精特新 ︱ 腾讯云 CODING 助力消费电子类企业高速发展期的研运一体化
    ......
  • 模块与包,反序列化源码解析,drf请求响应,视图组件两个视图基类
    0模块与包的使用#模块与包 -模块:一个py文件,被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件-包:一个文件夹下有__init__.py#模块与包的导入问题 '''0导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的1......
  • c++ 子类与父类的构造函数继承关系
    规范上,子类构造函数肯定是会调父类的构造函数。 如果代码中没写,就会隐含调用父类的默认构造函数(即那个无参构造函数)。如果父类没有,编译报错。 1,展示了当子类要调用父类中带参数的构造函数时:#include<iostream>#include<cstdio>classA{public:A(){printf("......
  • 链式-父类中返回子类对象
    一晃五年没写博客了,依旧再C#上耕耘,依旧没有啥建树,现在也不知道.net上还有多少人再使用,在这里分享一些自己觉得写的还算优雅的代码。对于自己写着完的代码,我特别喜欢链式(来源于jQuery的影响吧),大部分时候链式就是将返回值为void类型的对象,返回this指针,直到我遇到一个特殊情况——在......
  • ORACLE同步数据(dblink+物化视图)
    1.创建dblink createpublicdatabaselinkxirEvalDBlinkconnectto"XIR_TRD"identifiedby"xpar"USING'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=191.168.0.11)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_......
  • Oracle中dba,user,v$等开头的常用表和视图
    1、https://blog.csdn.net/a545812327/article/details/123146508或者遇见了也不知道是做什么用的,该文档主要用来供各位参考,以便更好的使用Oracle,有错误、缺失的地方欢迎指正。1Oracle常用表1.1dba_开头表1.2user_开头表1.3v$_开头表1.4all_开头表1.5session_开头表1.6i......