目录标题

  • 一:2个视图基类
    • 1.GenericAPIView的属性和方法
  • 二:基于APIView写5个接口
  • 三:基于GenericAPIView写5个接口
  • 四:五个视图扩展类
    • 1..基于GenericAPIView+5个视图扩展类写接口
  • 五:9个视图子类
  • 六:视图集
    • 1.继承ModelViewSet编写5个接口
  • 七:源码分析
  • 八:def中类之间的继承关系图

一:2个视图基类

1.GenericAPIView的属性和方法

属性:

属性 作用
queryset 要序列化的数据
serializer_class 序列化类
lookup_field 通过get_object获取单个对象的查询key值,value值是路由中传进来的
filter_backends 过滤类
pagination_class 分页类

方法:

方法 作用
get_queryset 获取要序列化的所有数据
get_object 获取要序列化的单条数据
get_serializer 获取序列化类
get_serializer_class 获取序列化类,不是直接用的get_serializer调用的它
filter_queryset 跟过滤有关系
paginate_xxx 跟分页有关系

二:基于APIView写5个接口

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 = UserSerializer(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(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': 100, 'msg': "修改成功"}, status=201)else:return Response({'code': 101, 'msg': ser.errors})def delete(self, request, pk):User.objects.filter(pk=pk).delete()return Response('')

三:基于GenericAPIView写5个接口

class UserView(GenericAPIView):queryset = User.object.all()serializer_class = UserSerializerdef get(self, request):res_list = self.get_queryset()ser = self.get_serializer(instance=res_list, many=True)return Response(ser.data)def post(self, request):ser = self.get_queryset(data=request.data)if ser.is_valid():return Response({'code': 100, 'msg': '新增成功'}, status=201)else:return Response({'code': 101, 'msg': ser.errors})class UserDetailView(GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef 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_serializer(instance=obj, data=request.data)if ser.is_Valid():ser.save()return Response('code': 100, 'msg': '修改成功' )else: return Response('code': 101, 'msg': ser.errors)def delete(self, request, pk):self.get_queryset().filter(pk=pk).delete()return Response('')

四:五个视图扩展类

1…基于GenericAPIView+5个视图扩展类写接口

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

from rest_framework.mixins import RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestoryModelMixin, ListModelMixinclass UserView(GenericAPIView, ListModelMixin, CreateModelMixin):# 配置两个类属性queryset = User.object.all()serializer_class = UserSerializerdef 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, UpdateModelMixin, DestoryModelMixin):queryset = User.object.all()serializer_class = UserSerializerdef 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.destory(request, *args, **kwargs)
视图扩展类 方法 对应视图类中的方法
CreateModelMixin create post
RetrieveModelMixin retrieve get
UpdateModelMixin update put
ListModelMixin list get
DestoryModelMixin destory delete

五:9个视图子类

from rest_framework.generics import ListAPIView,CreateAPIView,   RetrieveAPIView,DestroyAPIView,UpdateAPIView
from rest_framework.generics import ListCreateAPIView,     RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIViewclass UserView(ListCreateAPIView):# 配置两个 类属性queryset = User.object.all()serializer_class = UserSerializerclass UserDetailAPIView(RetrieveUpdateDestoryAPIView):queryset = User.object.all()serializer_class = UserSerializer

六:视图集

1.继承ModelViewSet编写5个接口

views.py

form rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSetclass UserView(ModelViewSet):queryset = User.object.all()serializer_class = UserSerializer

urls.py

path('user/', views.UserView.as_view({'get': 'list', 'post': 'create'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

七:源码分析

@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是老的requestdef 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=listsetattr(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

八:def中类之间的继承关系图

drf之day05: 2个视图基类,GenericAPIView的属性和方法,基于APIView写5个接口,基于GenericAPIView写5个接口,5个视图扩展类,9个视图子类,视图集相关推荐

  1. moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...

  2. 扩展方法必须在非泛型静态类中定义_第11篇:Cython面向对象编程--扩展类的实例化...

    我们前篇谈到了Cython的访问控制,并且谈论了cdef class关键字的底层操作,顺带也谈论了Python类为什么会比Cython类慢的原因.本篇我们将介绍Cython扩展类的初始化 Cython ...

  3. java类与对象(属性,方法)的使用

    ---恢复内容开始--- 类和对象是java编程中很重要的应该面向对象的一课,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语言的基础 ...

  4. 类中的属性和方法(Python入门三十三)

    # 定义一个类 class A(object): # 类属性     # 实例属性     # 类方法     # 实例方法     # 静态方法 # 类属性,直接在类中定义的属性是类属性     # ...

  5. 用类的思想求三角形的周长与面积。定义Triangel类,定义属性和方法求三角形的周长与面积.

    要求: 类的属性:三角形的三条边长 类的方法:def getZC(self)计算并返回周长,def printArea(self)计算并输出面积,面积精确到小数点后二位,def isCorrect(s ...

  6. Drf从入门到精通五(2个视图基类、5个视图拓展类、9个视图子类、视图集)

    文章目录 一.2个视图基类 1) 基于AIPView写5个接口 2) 基于GenericAPIView写5个接口 二.5个视图拓展类 1) 基于GenericAPIView+5个视图拓展类写接口 三. ...

  7. rest_framework05:GenericAPIView用法/扩展类5个/子类9个/ViewSetMixin 自定义方法名字

    GenericAPIView 1.视图层类使用GenericAPIView继承,能简化类里的方法code. 2.简化后的方法code格式基本通用,简单修改即可应用到其他类. 一.class开始加入 q ...

  8. jango-简单的mixin扩展类

    介绍 关于mixin,mix in是一种提供基础口味的冰淇淋(如香草,巧克力),可以往上添加坚果,饼干等.mixin作为扩展类通常用于多继承问题.多继承是Python语言的特色.一般通过继承或重写来使 ...

  9. php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别

    /** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...

最新文章

  1. 卷积神经网络(CNN)的简单实现(MNIST)
  2. Linux shell编程学习笔记-----第六章变量和引用
  3. 得到singleton类?
  4. CentOS7 安装并使用Ovirt 4.2
  5. 解决ora-12514 问题
  6. ubuntu常见问题总结
  7. C++Primer学习笔记:第8章 IO库
  8. Ververica Platform-阿里巴巴全新Flink企业版揭秘
  9. c 语言new运算符重载,c – 当我们重载new运算符时,是否需要重载放置new运算符?...
  10. java环境配置 Windows10
  11. 如何自己编写Makefile(高级篇)
  12. 一般什么时候加骨窗_高三成绩大幅度提高一般出现在什么时候?老师道出了实情...
  13. python运维都做些什么,Python运维工程师主要做什么?岗位职责!
  14. 100天python、github_GitHub - 1392792445/Python-100-Days: Python - 100天从新手到大师
  15. 注意!黑客可以通过CSS3功能攻击浏览器
  16. Android中自定义农历日历,Android实现自定义日历
  17. 打开一个英文文本文件,编写程序读取内容,将其中的小写字母转换为大写,大写字母转化为小写
  18. python turtle 绘图小猪佩奇_python海龟作图完成小猪佩奇
  19. 高手必备 | Revit插件到底哪个好?区别是什么?
  20. maven的依赖下载不下来,解决的几种方法(包括手动下载导入)

热门文章

  1. android平板怎么换字体大小,安卓手机设置字体大小全部教程
  2. 百度实习生一面与二面、用友实习生一面(Java开发)
  3. ASP.NET六大验证控件
  4. 爱思唯尔(Elsevier)期刊模板使用(一)
  5. 语音聊天工具 android,Android 即时语音聊天工具 开发
  6. 活该?清白?用数据可视化告诉你,3400多万人眼中的孙杨
  7. oracle空值影响索引么,使用索引的误区之四:空值对索引的影响-数据库专栏,SQL Server...
  8. 算法设计与分析(1)------算法概述
  9. 2022年12月份最新小程序头像昵称获取方式
  10. python可以一直玩的猜拳游戏