drf 视图类 GenericAPIView 及扩展

news/2024/5/1 20:36:03/文章来源:https://blog.csdn.net/weixin_71967396/article/details/127187519

drf 视图类 GenericAPIView 及扩展

文章目录

  • drf 视图类 GenericAPIView 及扩展
    • 1、2个视图基类
      • 1.1、GenericAPIView:属性和方法
      • 1.2、基于APIView 写5个接口
      • 1.3、基于GenericAPIView写5个接口
    • 2、5个视图扩展类
      • 2.1 基于GenericAPIView+5个视图扩展类写接口
    • 3、九个视图子类
      • 3.1、基于九个视图子类写接口
    • 4、视图集
      • 4.1、继承ModelviewSet 写五个接口
      • 4.2、源码分析ViewSetMixin
      • 4.3、总结
    • 作业:

1、2个视图基类

原来五个接口 继承APIview

**现在继承GenericAPIView **

1.1、GenericAPIView:属性和方法

属性

queryset
要序列化的属性

serializer_class
序列化类

一下作为了解
lookup_field
通过get_obj 获取单个对象的查询key值,value值是路由中传递来的

filter_backends
过滤类

pagination_class
分页类

方法
get_queryset
获取要序列化的数据

get_object
根据lookup_field配置是的参数获取单个对象

get_serializer
获取序列化类,咱们直接用的

get_serializer_class
获取序列化类,不是咱们直接用的get_serializer调用了它

以下了解
filter_queryset
跟过滤有关系

paginate_xxxx
跟分页有关

1.2、基于APIView 写5个接口

class UserView(APIView):def get(self, request):res_list = User.objects.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('')

1.3、基于GenericAPIView写5个接口

class UserView(GenericAPIView):# 配置两个 类属性queryset = User.objects.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_serializer(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(GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef get(self, request, pk):# obj = self.get_queryset().filter(pk=pk).first()# queryset.get({'pk':'有名分组分出来的'}obj = self.get_object()  # 根据传入的pk,获取一条数据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': "修改成功"}, status=201)else:return Response({'code': 101, 'msg': ser.errors})def delete(self, request, pk):self.get_queryset().filter(pk=pk).delete()return Response('')

2、5个视图扩展类

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

必须配合GenericAPIVi 使用,不能配合APIView使用

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

CreateModelMixin:写了一个create方法,就是原来咱们post中的代码

ListModelMixin: 写了一个list方法,就是原来咱们的get 获取单个

UpdateModelMixin: 写了一个update方法,就是咱们原来的put

RetrieveModelMixin: 写了一个retrieve方法,就是原来咱们的get

DestroyModelMixin: 写了一个destroy方法,就是原来咱们的delete

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin,ListModelMixinclass Books(ListModelMixin, GenericAPIView, CreateModelMixin):queryset = Book.objects.all()serializer_class = BookSerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class BookDetail(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerdef 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)

3、九个视图子类

视图类:继承GenericaAPIView+ 某个或某几个视图扩展类

from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveAPIView, UpdateAPIView, DestroyAPIView
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, \RetrieveUpdateAPIView

3.1、基于九个视图子类写接口

class BookView(ListCreateAPIView):queryset = Book.objects.all()serializer_class = BookSerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class BookViewDetail(RetrieveUpdateAPIView):queryset = Book.objects.all()serializer_class = BookSerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)class BookDelete(RetrieveUpdateDestroyAPIView):queryset = Book.objects.all()serializer_class = BookSerdef 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)

4、视图集

4.1、继承ModelviewSet 写五个接口

from rest_framework,viewsets import ModelviewSet,ReadOnlyModelViewSet  #只读
class BookViews(ModelViewSet):queryset = Book.objects.all()serializer_class = BookSer# 路由
path('book/',views.BookViews.as_view({'get': 'list','post':'create'})),path('book/<int:pk>/',views.BookViews.as_view({'get': 'retrieve','put':'update','delete':'destroy'})),

4.2、源码分析ViewSetMixin

@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

4.3、总结

APIView:as_view,dispatch
GenericAPIView:继承了APIView
类属性
方法

5、五个视图扩展类:
ListModelMixin
CreateModelMixin
RetrieveModelMixin
UpdateModelMixin
DestroyModelMixin
每个类里面有一个方法

9个视图子类:
5个视图扩展类+GenericAPIView组合

视图集
ViewSetMixin:魔法 重写了as_view,只要继承它,路由写法就变了
ViewSet: ViewSetMixin+APIView
GenericViewSet: ViewSetMixin+GenericAPIView
ModelViewSet: 5个视图扩展类+GenericViewSet
ReadOnlyModelViewSet: 2个视图扩展类+GenericViewSet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCw2EJXi-1665059450643)(C:\Users\82576\Downloads\视图类继承关系.png)]
在这里插入图片描述

作业:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wD7LRa9U-1665059450645)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20221006202749064.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_19456.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UCB操作系统CS162项目】Pintos Lab2:用户程序 User Programs(下)

在上节中&#xff0c;我们已经完成了 Lab 2 要求的参数传递和系统调用中的 halt, exit 以及向 stdout 输出的 write&#xff0c;最终停在了 wait 的实现之前。本节就先从 wait 和 exec 继续。 Syscall wait exec&#xff1a;实现父子进程 讲义中 wait 的要求是这样的&#x…

这几个文字翻译工具确定不试试看?

想问问大家平常会接触到TXT文件吗&#xff1f;这是微软在操作系统上附带的一种文本格式&#xff0c;主要是保存纯文字信息&#xff0c;像我们电脑上自带的记事本工具&#xff0c;就是使用这种文件格式。有时候我们需要将文本内容翻译成中文。那你知道如何实现TXT翻译成中文吗&a…

LRU缓存——哈希表+双向链表

一、题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; 1&#xff09;LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 2&#xff09;int get(int key) 如果关键字 key 存在于缓存中&#xff0c;…

STA系列 - 特殊时序分析multicycle/half-cycle/false path

文章目录什么是require time/arrive timeMulticycle PathHalf PathFalth Path本篇文章介绍的是特殊的时序path, 全文为视频笔记&#xff0c;以及自己的理解https://www.bilibili.com/video/BV1if4y1p7Dq?p10&vd_source84d1070e8334ce7e2bb0bd110abcf1a7什么是require time…

使用服务器跑模型——案例2

案例2 在本案例中我们使用vscode来上传/下载文件&#xff0c;服务器端编程和debug。 下载 vscode 在官网下载vscode正式版&#xff0c;别使用家庭版。下载地址https://code.visualstudio.com/Download。 使用 vscode 连接服务器 在vscode扩展中搜索ssh并下载安装。 安装成功…

【机器学习】熵权算法确定权重 原理+完整MATLAB代码+详细注释+操作实列

【机器学习】熵权算法确定权重 原理完整MATLAB代码详细注释操作实列 文章目录 1. 熵权法确定指标权重 &#xff08;1&#xff09;构造评价矩阵 Ymn &#xff08;2&#xff09;评价矩阵标准化处理 &#xff08;3&#xff09;计算指标信息熵值 Mj &#xff08;4&#xff09…

原生JS项目练习——验证码的生成及教验

一、主要功能介绍&#xff1a; 1、通过for循环生成生成六位随机验证码 2、通过for循环随机生成验证码颜色 3、窗口加载事件&#xff0c;窗口一加载就调用函数&#xff0c;重置验证码 4、按钮点击事件&#xff0c;一点击就调用函数&#xff0c;重置验证码 5、input输入框已失去焦…

Yarn概述

Hadoop系列 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase…

公众号网课搜题接口系统

公众号网课搜题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;…

快速开发微信小程序之二-微信支付

一、背景 在面试程序员的时候&#xff0c;有两项经历会带来比较大的加分&#xff0c;第一你是否做过支付金融相关的业务&#xff0c;第二你是否写过底层框架中间件代码&#xff0c;今天我们聊一下微信支付是如何对接的。 二、相关概念 1、微信商户平台 要使用微信支付&#…

一、mini2440_bsp_led

一、芯片手册 1、板子原理图 2、GPIO使用 &#xff08;1&#xff09;GPxCON &#xff08;2&#xff09;GPxDAT 二、实现分析 1、初始化led 设置GPBCON&#xff08;0x56000010&#xff09;为 0x00015400 2、设置led输出&#xff0c;根据原理图引脚输出低电平时灯被点亮 LED1…

K8s-临时容器 Ephemeral Containers

临时容器 Ephemeral Containers 当由于容器崩溃或容器镜像不包含调试工具而导致 kubectl exec 无用时&#xff0c; 临时容器对于交互式故障排查很有用。尤其是&#xff0c;Distroless 镜像 允许用户部署最小的容器镜像&#xff0c;从而减少攻击面并减少故障和漏洞的暴露。 由于…

C | 枚举?看一遍就够了

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 啊我摔倒了..有没有人扶我起来学习.... 目录前言枚举1. 枚举的定义2. 枚举的内存大小3. 枚举的优势4. 枚举需要注意的地方前言 结构体、枚举、联合体都是自定义类型&#xff0c;结构体主要知识点结构体内存对齐可参考《C | …

九月SLAM相关论文速递

九月SLAM相关论文速递 论文列表DirectTracker: 3D Multi-Object Tracking Using Direct Image Alignment and Photometric Bundle Adjustment3D VSG: Long-term Semantic Scene Change Prediction through 3D Variable Scene GraphsLeveraging Large Language Models for Robo…

使用服务器跑模型——案例1

案例1 该方法mac&#xff0c;linux&#xff0c;windows都通用。我们使用terminal or cmd进行操作。 假设我们本地具有一个需要跑的模型Unet&#xff0c;我们需要将该模型上传到服务器上跑&#xff0c;步骤如下&#xff1a; 使用tar压缩文件 我们定位到我们需要压缩的模型&a…

云原生之容器编排实践-以k8s的Service方式暴露SpringBoot服务

背景 上一篇文章云原生之容器编排实践-SpringBoot应用以Deployment方式部署到minikube以及弹性伸缩中&#xff0c;我们通过 Deployment 完成了将 SpringBoot 应用部署到 minikube 并测试了其弹性伸缩的丝滑体验。但是 Deployment 部署后我们还面临以下问题&#xff1a; 访问时…

Day761.Redis集群方案:Codis -Redis 核心技术与实战

Redis集群方案&#xff1a;Codis Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Redis集群方案&#xff1a;Codis Redis 的切片集群使用多个实例保存数据&#xff0c;能够很好地应对大数据量的场景。哨兵集群&#xff0c; Redis 官方提供的切片集群方案 Redis Clus…

SPI总线通信——基于STM32MP157A

SPI总线概念 SPI总线是Motorola首先提出的全双工三线/四线同步串行总线&#xff0c;采用主从模式&#xff08;Master Slave&#xff09;架构&#xff1b;支持多从机&#xff08;slave&#xff09;模式应用&#xff0c;一般仅支持单主机&#xff0c;多从机。 时钟由主机控制&…

java培训技术处理模型数据之 ModelAndView

处理模型数据之 ModelAndView 1 ModelAndView介绍 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息&#xff0c;也包含模型 数据信息。 2&#xff09;添加模型数据: MoelAndView addObject(String attributeName, Object attributeValue) ModelAndView…

C#-设计模式学习笔记

目录前言&#xff1a;最近得到师傅指点&#xff0c;建议我多学习下设计模式&#xff0c;简单记录下学习过程中的一些知识点1.设计模式&#xff08;创建型&#xff09;1.单例模式&#xff1a;1. 单例模式的主要作用2.单例模式能解决的问题3.单例模式的使用场景4.怎么实现单例模式…