5个视图扩展类

# 写5个类(不叫视图类 视图拓展类 需要配合GenericAPIView一起用) 每个类有一个方法 以后想写哪个接口 就继承哪个类即可
from rest_framework.response import Response ####自己封装的5个视图拓展类
class ListModelMixin:
def list(self,request):
qs = self.get_queryset()
ser = self.get_serializer(qs,many=True)
return Response({'code':100,'msg':'成功','result':ser.data}) class CreateModelMinxin:
def create(self,request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'成功'})
else:
return Response({'code':100,'msg':'失败'}) class RetrieveModelMixin:
def retrieve(self,request,*args,**kwargs):
qs = self.get_object()
ser = self.get_serializer(qs)
return Response({'code':100,'msg':'成功','result':ser.data}) class UpdateModelMixin:
def update(self,request,*args,**kwargs):
qs = self.get_object()
ser = self.get_serializer(qs,data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'成功'})
else:
return Response({'code': 100, 'msg': '失败'}) class DestroyModelMixin:
def destroy(self,request,*args,**kwargs):
qs = self.get_object()
qs.delete()
return Response({'code':100,'msg':'成功'}) #### drf封装好的
from .models import Book
from .serializer import BookSerializer
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView from rest_framework.mixins import ListModelMixin,CreateModelMinxin,UpdateModelMinxin,DestroyModelMixin,
RetrieveModelMixin class BookView(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer def get(self,request):
return self.list(request) def post(self,request):
return self.create(request) class BookDetailView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,
DestroyModelMixin):
queryset = Book.object.all()
serializer_class = BookSerializer 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个接口中的其中一个 想写多个接口 就要继承多个

9个视图子类

'''基于视图子类写接口 9个视图子类--->视图类'''
from rest_framework.generics import ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
from rest_framework.generics import ListCreateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.generics import RetrieveUpdateAPIView
from rest_framework.generics import RetrieveDestroyAPIView
# from rest_framework.generics import UpdateDestroyAPIView # 这个没有 # ModelViewSet:
继承它后 只需要在视图类中写两行
queryset = Book.objects.all()
serializer_class = BookSerializer
配置路由,5个接口都有了
path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
######
def list(self, request, *args, **kwargs):
res = super().list(request,*args,**kwargs)
return Response({'code': 100, 'msg': '成功', 'data': res.data})
可以重写父类中的方法 但是一定不能用self. 必须使用super() 否则会递归 # 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
hander = getattr(self,action)
# 通过反射:setattr(BookView的对象,'get',list方法)
setattr(self,method,handler)
# APIView的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个视图子类),必须放在视图类之前
"""

视图集

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

drf之路由

# 路由的写法有多种
原始写法
映射的写法:path('books/',BookView.as_view({'get':'list','post':'create'}))
自动生成路由 # 自动生成路由
必须要继承ViewSetMixin及其子类的视图类,才能用
继承了 5个视图扩展类+ViewSetMixin的视图类,能自动生成路由(ModelViewSet)
跟咱们写的这个是一样的
path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})) '''第一步 导入一个路由类'''
from rest_framework.routers import SimpleRouter
'''第二步 实例化得到对象'''
router = SimpleRouter()
'''第三步 注册路由(视图类) 第一个参数是前缀 第二个参数是视图类 第三个参数是别名'''
router.register('books',BookView,'books')
# http://127.0.0.1:8000/api/v1/books/books/
# 第一个books是注册路由时的前缀 第二个books是action装饰器的url_path参数
'''第四部 加入到路由中'''
# 4.1 方式一
# urlpatterns += router.urls
# 4.2 方式二
# 使用include path('api/v1/', include(router.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):
return Response('你好')
# 路由
router.register('lqz',SMSView,'lqz')
# 路径是:http://127.0.0.1:8000/api/v1/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根视图,返回一个包含所有列表视图的超链接响应数据(提示你可以访问哪些路径)。

drf——5个视图扩展类、9个视图子类、视图集、drf之路由的更多相关文章

  1. drf-day5——反序列化类校验部分源码分析、断言、drf请求、drf响应、视图组件及两个视图基类、基于GenericAPIView+5个视图扩展类

    目录 一.反序列化类校验部分源码解析(了解) 二.断言 三.drf之请求 3.1 Request能够解析的前端传入的编码格式 3.2 Request类有哪些属性和方法(学过) 常用参数 Respons ...

  2. [Django REST framework - 视图组件之视图基类、视图扩展类、视图子类、视图集]

    [Django REST framework - 视图组件之视图基类.视图扩展类.视图子类.视图集] 视图继承关系 详图见文章末尾 视图组件可点我查看 两个视图基类:APIView.GenericAP ...

  3. DRF (Django REST framework) 中的视图扩展类

    2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...

  4. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  5. drf-drf请求、响应、基于GenericAPIView+5个视图扩展类

    1.反序列化类校验部分源码分析(了解) 1.当我们在视图类中生成一个序列化类对象ser,并且用ser.is_valid()是就会执行校验,校验通过返回True,不通过返回False.首先对象ser和序 ...

  6. django-rest-framework框架 第三篇 之CRUD视图扩展类(增删改查的优化)

    CRUD视图扩展类 1 CreateModelMixin 2 RetrieveModelMixin 3 UpdateModelMixin 4 DestroyModelMixin <1> 创 ...

  7. Django视图扩展类

    Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类 ...

  8. GenericAPIView的使用及和视图扩展类的结合使用

    GenericAPIView的使用 from rest_framework.generics import GenericAPIView GenericAPIView继承 APIView,主要增加了操 ...

  9. 基于GenericAPIView以及五个视图扩展类写接口

    目录 基于GenericAPIView以及五个视图扩展类写接口 一.基于GenericAPIView写接口 二 .基于GenericAPIView以及五个视图扩展类写接口 基于GenericAPIVi ...

  10. DRF中五大扩展类及视图集的介绍

    五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对 ...

随机推荐

  1. Redis Stream Commands 命令学习-1 XADD XRANGE XREVRANGE

    概况 A Redis stream is a data structure that acts like an append-only log. You can use streams to reco ...

  2. 写.jsp项目有感

    本次练习了一个简单的登录界面 我觉得在写这种类型的界面的时候,需要将各个需求分开,就以这次的登录界面为例展开说说 1.登录界面 输入框的居中问题.登录按钮的跳转问题.验证码图片的随机问题.快速注册的跳 ...

  3. Spring--注解开发定义Bean

    注解开发 先看一看之前的bean的做法: 所谓注解开发,当然就要用到注解啊,就是在BookDao接口的实现类里面进行注解的定义 如图所示: 而在.xml文件里面,就需要进行这样一个操作: 注解当然不会 ...

  4. 一起来试玩!在线可编程交互的实时音视频 Web SDK 入门教程

    在与开发者长期的沟通中,我们发现,尽管声网为开发者提供了丰富翔实的 SDK 技术文档,但对于初次接触声网 SDK 的开发者来说,在第一眼看到文档的时候,可能会被大量新概念和复杂的 API 接口淹没.S ...

  5. 2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

    前言 去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容 ...

  6. 正则表达式(cases)

    匹配不含'aaa'和'bbb'的字符串: ^(?!.*aaa)(?!.*bbb).*$ To be continue...

  7. 主板芯片组驱动和Win系统版本互相关联

    主板芯片组驱动和Win系统版本互相关联,过早的系统安装较新版的芯片组驱动,或者较新版本的操作系统安装旧版的芯片组驱动,都可能导致系统不稳定蓝屏.解决方案就是安装最新的芯片组驱动和最新版的操作系统.

  8. 德国坦克傲龙7.1PCIe | 魔音师 声源PCIe MaX 声卡驱动皮肤

    适用于德国坦克傲龙7.1PCIe和魔音师 声源PCIe MaX 声卡驱动皮肤的皮肤. 皮肤使用方法:退出声卡驱动程序(托盘图标右键退出),之后删除声卡驱动目录里面的TERRATECAudioCente ...

  9. 传输层和网络层的checksum区别,TCP cksum为何包含伪首部

    一直搞不清传输层和网络层的校验和为什么校验内容不一样,最近问了一些前辈,找寻了一些答案,总结一下自己的思考. 先说一下传输层(TCP)和网络层(IP)的校验和: TCP校验和有伪首部.TCP herd ...

  10. Unity3D中的Attribute详解(六)

    本文将重点对Unity剩下常用的Attribute进行讲解,其他不常用的Attribute各位可以自行去官方文档查阅. 首先是UnityEngine命名空间下的. ColorUsage,这个主要作用于 ...