首页 > 其他分享 >5个视图扩展类,9个视图子类,视图集,drf之路由

5个视图扩展类,9个视图子类,视图集,drf之路由

时间:2023-05-22 20:44:47浏览次数:38  
标签:BookView get 子类 self request 视图 路由 drf

5个视图扩展类:

 1 from .models import Book
 2 from .serializer import BookSerialzier
 3 from rest_framework.response import Response
 4 from rest_framework.generics import GenericAPIView
 5 
 6 from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, \
 7     RetrieveModelMixin
 8 
 9 
10 class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):
11     queryset = Book.objects.all()
12     serializer_class = BookSerialzier
13 
14     def get(self, request):
15         return self.list(request)
16 
17     def post(self, request):
18         return self.create(request)
19 
20 
21 
22 class BookDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
23     queryset = Book.objects.all()
24     serializer_class = BookSerialzier
25 
26     def get(self, request, *args, **kwargs):
27         return self.retrieve(request, *args, **kwargs)
28 
29     def put(self, request, *args, **kwargs):
30         return self.update(request, *args, **kwargs)
31 
32     def delete(self, request, *args, **kwargs):
33         return self.destroy(request, *args, **kwargs)

  总结:

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

9个视图子类:

   ListAPIView:查所有,相当于get

   CreateAPIView:增加,相当于post

      UpdateAPIView:修改,相当于put

   RetrieveAPIview:查单个,相当于get

   DestroyAPIView:删除,相当于delete

   ListCreateAPIView:增加和查所有--------->get+post

   RetrieveUpdateAPIView:查单个和修改-------------->get+put

     RetrieveDestroyAPIView:查单个和删除---------------->get+delete

    RetrieveUpdateDestroyAPIView:查单个,修改和删除------------------->get+put+delete

from rest_framework.generics import ListAPIView,CreateAPIView,UpdateAPIView,RetrieveAPIView,DestroyAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView
class BookView(ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

 

 视图集:

   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)
          # 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个视图子类),必须放在视图类之前

   view层:

   url层:

 

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

    GenericViewSet:ViewSetMixin+GenericAPIView,以后想继承GenericAPIView,但是想路由写法变化,视图类中方法可以任意命名

 drf之路由:

  自动生成路由
    -必须要继承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'})),

  第一种方式:

   第二种加入总路由的方式:

    导入include模块:from django.urls  import  include

    在urlpatterns中加入:include(rounter.urls)

 

  自动生成路由
    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/

 

 

    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根视图,返回一个包含所有列表视图的超链接响应数据。

 

标签:BookView,get,子类,self,request,视图,路由,drf
From: https://www.cnblogs.com/Hao12345/p/17421682.html

相关文章

  • 2个视图基类,5个视图扩展类,9个视图子类,视图集,自动生成路由
    考p.name改变的是p对象自己的属性所以p.name='彭于晏'p1.name=lqz15个视图扩展类#写5个类(不叫视图类,视图扩展类,需要配合GenericAPIView一起用),每个类有一个方法,以后想写哪个接口,就继承哪个类即可from.modelsimportBookfrom.serializerimportBookSerialzierf......
  • 两个视图基类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)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。优点定制用户数据,聚焦特定的数据简化数据操作提高数据的安全性共享所需数据......
  • drf-请求与响应
    目录1模块与包的使用2断言3drf之请求3.1Request类对象的分析3.1.1Request3.1.2属性3.2请求,能够接受的编码格式4drf之响应4.1响应类的对象Response4.1.1Response4.1.2属性4.2响应的格式4.3状态码5视图之两个视图基类5.1使用APIView+序列化类+Response写接口5.2推导......
  • drf之APIView+序列化类+Response
    昨日回顾#0ser=BookSerialzier(instance=qs,many=True)---->ListSerializer[序列化对象,序列化对象]ser=BookSerialzier(instance=book)---->BookSerialzier#1定制序列化的字段之source,字段参数 -指定一个要序列化的对象中得字段-指定一个要序列化的对象中得方法,方......
  • 专精特新 ︱ 腾讯云 CODING 助力消费电子类企业高速发展期的研运一体化
    ......
  • Day04 drf之source序列化字段定制与反序列化校验、modelserializer使用
    今日内容1序列化高级用法之source(了解)#1创建了5个表(图书管理的5个)#2对booke进行序列化#总结:source的用法 -1修改前端看到的字段key值---》source指定的必须是对象的属性 book_name=serializers.CharField(source='name')-2修改前端看到的value值,---......
  • 模块与包,反序列化源码解析,drf请求响应,视图组件两个视图基类
    0模块与包的使用#模块与包 -模块:一个py文件,被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件-包:一个文件夹下有__init__.py#模块与包的导入问题 '''0导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的1......
  • drf之反序列化校验源码分析 、 断言 、drf之请求和响应
    目录一、反序列化校验源码分析入口:总结:二、断言三、drf之请求3.1Request类对象的分析.data.query_params其他的属性用起来跟之前一样3.2请求,能够接受的编码格式限制只能接受某种或某几种编码格式限制方式一:在视图类上写---》只是局部视图类有效限制方式二:在配置文件中写---》全......