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. 关于Spring注解的基础详解(补充上次并不清楚的内容)

    注解,需要在.xml文件里面加这么一句话:<context:component-scan base-package=""/>(组件) Component注解 主要用于接 ...

  2. University of Toronto Scarborough Campus December 7, 2017 CSC C73 Final Examination Instructor: Vassos Hadzilacos

    https://app.yinxiang.com/shard/s59/res/8a11b895-19b5-4ca1-aefe-10b5985b8af9/CSCC73 Final 17.pdf 自己尝试 ...

  3. flex布局相关属性记录

    <template> <div class="about"> <h3>flex相关的属性</h3> <div class=&q ...

  4. react中的虚拟DOM,jsx,diff算法。让代码更高效

    在react中当你的状态发生改变时,并不是所有组件的内容销毁再重建,能复用的就复用 react 组件其实 就是按照层级划分的 找到两棵任意的树之间最小的修改是一个复杂度为 O(n^3) 的问题. 你可 ...

  5. ACM-学习记录-DP-1

    DPL_1_A: Coin Changing Problem 每次均有两种选择,即选择当前的,即为在当前状态+1,否则维持原来的T[j+d[i]] #include<iostream> # ...

  6. Thanos工作原理及组件简介

    Thanos 简介 Thanos 是一个「开源的,高可用的 Prometheus 系统,具有长期存储能力」.很多知名公司都在使用 Thanos,也是 CNCF 孵化项目的一部分. Thanos 的一个 ...

  7. NetCore 使用 Swashbuckle 搭建 SwaggerHub

    什么是SwaggerHub? Hub 谓之 中心, 所以 SwaggerHub即swagger中心. 什么时候需要它? 通常, 公司都拥有多个服务, 例如商品服务, 订单服务, 用户服务, 等等, 每 ...

  8. day03-搭建微服务基础环境02

    搭建微服务基础环境02 3.创建使用会员微服务模块-service consumer 3.1需求分析 浏览器向service consumer请求某个数据,service consumer会去向ser ...

  9. PVE Cloud-INIT 模板配置

    PVE Cloud-INIT 模板配置 Cloud-init是什么 Cloud-init是开源的云初始化程序,能够对新创建弹性云服务器中指定的自定义信息(主机名.密钥和用户数据等)进行初始化配置.通过 ...

  10. kubernetes 启用 PHP + Nginx 网页环境

    kubernetes 启用 PHP + Nginx 网页环境 传统安装方式进行安装步骤较多,使用kubernetes可以实现快速启用环境,在测试或者线上都可以做到快速 启用 编写 yaml 文件 [r ...