【Django-rest-framework框架】第04回 视图集

news/2024/5/4 12:48:02/文章来源:https://www.cnblogs.com/cainiaozhy/p/16745896.html

目录
  • 1. 两个视图基类
    • 1.1 GenericAPIview属性和方法
    • 1.2 基于APIView写5个接口
    • 1.3 基于GenericAPIview写5个接口
  • 2. 5个视图扩展类
  • 3. 9个视图子类
  • 4. 视图集
  • 5. 源码分析ViewSetMixin
  • 6. 总结
  • 7 继承关系画出来,有哪些常用属性或方法写出来

1. 两个视图基类

1.1 GenericAPIview属性和方法

属性:serializer_class:指明视图使用的序列化器
方法:get_serializer_class(self):获取序列化类get_serializer(self,*args,*kwargs):该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。request 当前视图的请求对象view 当前请求的类视图对象format 当前请求期望返回的数据格式
属性:quesyset:指明使用的数据查询集
方法:get_queryset(self):获取序列化数据get_objest(self):根据lookup_field配置的参数获取单个对象
1. lookup_field  # 通过get_object  获取单个对象的查询key值,value值是路由中传进来的
2. filter_backends  # 过滤类
3. pagination_class # 分页类

1.2 基于APIView写5个接口

from django.shortcuts import render# Create your views here.
from rest_framework.views import APIView
from .models import User
from rest_framework.response import Response
from .serializer import UserSerializerclass UserView(APIView):def get(self, request):user_list = User.objects.all()ser = UserSerializer(instance=user_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):user = User.objects.filter(pk=pk).first()ser = UserSerializer(instance=user)return Response(ser.data)def put(self, request, pk):user = User.objects.filter(pk=pk).first()ser = UserSerializer(instance=user, data=request.data)if ser.is_valid():ser.save()return Response({'code': 100, 'msg': '修改成功'}, status=201)else:return Response({'code': 100, 'msg': ser.errors})def delete(self, request, pk):User.objects.filter(pk=pk).delete()return Response('')

1.3 基于GenericAPIview写5个接口

from rest_framework.generics import GenericAPIViewclass UserView(GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef get(self, request):user_list = self.get_queryset()ser = self.get_serializer(instance=user_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):user = self.get_object()ser = self.get_serializer(instance=user)return Response(ser.data)def put(self, request, pk):user = self.get_object()ser = self.get_serializer(instance=user, data=request.data)if ser.is_valid():ser.save()return Response({'code': 100, 'msg': '修改成功'}, status=201)else:return Response({'code': 100, 'msg': ser.errors})def delete(self, request, pk):self.get_queryset().filter(pk=pk).delete()return Response('')

2. 5个视图扩展类

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

CreateModelMixin:写了一个Create方法,就是原来咱们post中的代码
RetrieveModelMixin:retrieve,就是咱们原来的get
UpdateModelMixin:update方法,就是咱们原来的put
ListModelMixin:list方法,就是原来咱们的get
DestroyModelMixin:destroy方法,就是原来咱们的deletelist() 提供一组数据
retrieve() 提供单个数据
create() 创建数据
update() 保存数据
destory() 删除数据
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, \ListModelMixinclass UserView(GenericAPIView, ListModelMixin, CreateModelMixin):queryset = User.objects.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, DestroyModelMixin):queryset = User.objects.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.destroy(request, *args, **kwargs)

3. 9个视图子类

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

from rest_framework.generics import ListAPIView,CreateAPIView,   RetrieveAPIView,DestroyAPIView,UpdateAPIView
from rest_framework.generics import ListCreateAPIView,     RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
正常来讲  Destroy+Update 应该有一个,作者没加,可能没有应用场景
from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveAPIView, DestroyAPIView, UpdateAPIView
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView, RetrieveUpdateAPIView, \RetrieveDestroyAPIViewclass UserView(ListCreateAPIView):queryset = User.objects.all()serializer_class = UserSerializerclass UserDetailView(RetrieveUpdateDestroyAPIView):queryset = User.objects.all()serializer_class = UserSerializer

4. 视图集

继承ModelViewSet编写5个接口

视图类
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class UserView(ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer
路由
path('user/', views.UserView.as_view({'get': 'list', 'post': 'create'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

5. 源码分析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)1. 只要继承了ViewSetMixin,以后路由写法变量,都要协程:views.UserView.as_view({'get': 'list', 'post': 'create'}))
2. 这样写好以后,对应的请求方式来了,就会执行配置的方法
3. 以后只要继承了ViewSetMixin,视图类中可以写任意名字的方法,不用非得写get,post,delete

6. 总结


#两个基类
APIView
GenericAPIView:有关数据库操作,queryset 和serializer_class#5个视图扩展类(rest_framework.mixins)
CreateModelMixin:create方法创建一条
DestroyModelMixin:destory方法删除一条
ListModelMixin:list方法获取所有
RetrieveModelMixin:retrieve获取一条
UpdateModelMixin:update修改一条#9个子类视图(rest_framework.generics)
CreateAPIView:继承CreateModelMixin,GenericAPIView,有post方法,新增数据
DestroyAPIView:继承DestroyModelMixin,GenericAPIView,有delete方法,删除数据
ListAPIView:继承ListModelMixin,GenericAPIView,有get方法获取所有
UpdateAPIView:继承UpdateModelMixin,GenericAPIView,有put和patch方法,修改数据
RetrieveAPIView:继承RetrieveModelMixin,GenericAPIView,有get方法,获取一条ListCreateAPIView:继承ListModelMixin,CreateModelMixin,GenericAPIView,有get获取所有,post方法新增
RetrieveDestroyAPIView:继承RetrieveModelMixin,DestroyModelMixin,GenericAPIView,有get方法获取一条,delete方法删除
RetrieveUpdateAPIView:继承RetrieveModelMixin,UpdateModelMixin,GenericAPIView,有get获取一条,put,patch修改
RetrieveUpdateDestroyAPIView:继承RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView,有get获取一条,put,patch修改,delete删除#视图集
ViewSetMixin:重写了as_view 
ViewSet:     继承ViewSetMixin和APIViewGenericViewSet:继承ViewSetMixin, generics.GenericAPIView
ModelViewSet:继承mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
ReadOnlyModelViewSet:继承mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet

7 继承关系画出来,有哪些常用属性或方法写出来

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

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

相关文章

【redis】7.1 分布式架构概述(章节介绍)

分布式架构概述 请求业务比较长&#xff08;耗时业务&#xff09;&#xff0c;需要分布式系统。 1. 本章节内容 分布式缓存中间件Redis分布式会话与单点登录分布式搜索引擎Elasticsearch分布式文件系统分布式消息队列分布式锁数据库读写分离与分库分表数据库表全局唯一主键i…

迭代器并不全是指针,list的迭代器与vector和string的有什么不一样,让博主告诉你其底层原理!

链表的模拟实现 文章目录链表的模拟实现一、list的基本架构&#x1f916;_list_node基本构架--双向带头循环链表二、list的迭代器--重点&#x1f431;‍&#x1f464;list迭代器的基本架构构造函数--node*封装operator*()--得到值operator!()--跟另一个迭代器进行比较operator(…

xLua热更新(一)xLua基本使用

一、什么是xLua xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力&#xff0c;借助xLua&#xff0c;这些Lua代码可以方便的和C#相互调用。 xLua是用来实现Lua代码与C#代码相互调用的插件。我们可以借助这个插件来实现热更新方案。 那么为什么要选择Lua实现热更新呢&am…

报告分享|数字化转型,从战略到执行报告

报告链接:http://tecdat.cn/?p=28672 如何加速国家、城市、行业、企业数字化进程,激发数字经济新动能。这份报告通过洞察数字化的6大改变、4大载体、4个阶段、20+场景、100+国家/项目案例/数据,全面系统性地阐述了多层次多场景数字化如何落地实施,最终带来经济、社会价值的…

报告分享|2022年企业数字化人才发展白皮书

报告链接:http://tecdat.cn/?p=28670 数字经济时代,企业对数字化人才的需求急剧增长。此报告对数字化人才培养和企业数字化人才发展现状进行梳理和研究,聚焦于金融、零售、能源和制造四个行业,采用定量与定性相结合的研究方法,对数字化人才的发展态势、岗位能力需求、培养…

第八章 常用用类

文章目录8.4 StringBuffer类8.4.1 StringBuffer对象8.4.2 StringBuffer类的常用方法1.append方法2.charAt(int n)和setCharAt(int n, char ch)8.5 Date类与Calendar类8.5.1 Date类8.5.2 Calendar类8.6 日期的格式变化8.6.1 format方法8.6.2 不同区域的星期格式8.7 Math类、BigI…

【算法】【二叉树模块】求一个二叉树“子树“是否包含另一个二叉树的全部拓扑结构

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介绍 …

三个线程顺序打印ABC?我有十二种做法,彻底掌握多线程同步通信机制

大家好&#xff0c;我是老三&#xff0c;这篇文章分享一道非常不错的题目&#xff1a;三个线程按序打印ABC。 很多读者朋友应该都觉得这道题目不难&#xff0c;这次给大家带来十二种做法&#xff0c;一定有你没有见过的新姿势。 1. synchronizedwaitnotify 说到同步&#xf…

Swift中的内存访问冲突、指针、局部作用域

内存访问冲突&#xff08;Conflicting Access to Memory&#xff09; 1、内存访问冲突会在两个访问满足以下条件时发生&#xff1a; 至少一个是写入操作它们访问的是同一块内存它们的访问时间重叠&#xff08;比如在同一个函数内&#xff09; //无内存访问冲突 func plus(_ n…

PIE-engine 教程 ——利用NDWI加载青海湖三年水域影像和面积计算

这里我们首先画一个自己选择的研究区&#xff0c;用于方便计算NDWI&#xff0c;这里我们将青海湖区域作为我们的研究区&#xff0c;第二步我们就是要设定一个函数&#xff0c;用于在函数中执行循环遍历&#xff0c;这里包括去云和影像筛选过程&#xff0c;最后按照最大值合成&a…

Windows 10 docker 容器添加新端口映射的方法与步骤

在Docker容器已经创建后&#xff0c;需要添加新的端口映射&#xff0c;即对已经存在的Docker容器添加新的端口映射&#xff0c;可以通过以下步骤来添加&#xff0c;即通过修改配置文件的方法。 1、Windows 10 下 Dockers容器的配置文件存在的路径为&#xff1a; 笔者本文是20…

CLIP扩展

Audio CLIP:Extend CLIP to Image,Text and Audio&#xff08;语音&#xff09; 在已有的image、text 的基础上又加上了audio语音模态。 找了一些视频&#xff0c;有视频帧&#xff08;图像&#xff09;、文本、语音三种模态的信息&#xff0c;仿照CLIP的模型结构。三种模态两…

SpringSecurity + JWT(前后端分离)

文章目录一、先来聊聊 SpringSecurity JWT二、简单聊聊SpringSecurity 完整流程1、认证2、授权三、撸代码1、入门案例2、认证-前端端分离 Demo2.1 环境准备2.2 密码加密存储2.3 数据库校验存储2.4 编写自定义登陆接口2.5 JWT 认证过滤器2.6 退出登陆3、授权-前后端分离 Demo3.…

Spring In Action 5 学习笔记 chapter8 RabbitMQ(AMQP)要点

本文记录Sping In Action5 第8章 发送异步消息 RabbitMQ(AMQP)中的踩坑情况。 网搜的Spring In Action5的书籍在线翻译 https://potoyang.gitbook.io/spring-in-action-v5/ 第8章的源码请自行github或gitee搜索&#xff0c;或参考一下。 GitHub - habuma/spring-in-action-5…

web学生网页设计作业源码 HTML+CSS+JS 网上鲜花商城购物网站

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

MySQL Workbench 创建用户

创建本机用户 选择权限(增删改查)6个 创建新用户编辑窗口

【Web基础】Web应用体系结构 — 容器 + MVC设计模式

前言&#xff1a;提前祝大家国庆快乐了~~~~ 文章目录1 容器1.1 容器定义1.2 容器功能1.3 容器如何处理请求1.4 URL 映射 servlet2. MVC设计模式2.1 MVC 设计模式定义2.2 为什么要采用 MVC 设计模式&#xff1f;1 容器 1.1 容器定义 Servlet 没有 main() 方法&#xff0c;它们…

Vue再次入门<一>互动教程

两年前入了个门&#xff0c;很久没摸&#xff0c;又忘了。这次再来&#xff0c;改变下只做笔记的方式&#xff0c;改为边学边动手敲。加油&#xff0c;maymay&#xff5e; No one can stop u except yourself&#xff01; Vue再次入门一&#xff0c;互动教程1&#xff0c;声明式…

Windows11 家庭版开启远程桌面解决方案之RDP Wrapper Library,小白全面攻略

Windows11家庭版 首先需要了解的是Windows11是不支持家庭版的&#xff0c;那么既然看到了这里&#xff0c;那一定是具备解决方案的&#xff0c;方案就是通过 RDP Wrapper Library RDP软件下载 一定要下载合适的版本&#xff0c;最新的不一定是最合适的&#xff01; CSDN下载…

python代码学习——递归函数

python代码学习——递归函数函数的调用变量名解析&#xff08;查找&#xff09;原则&#xff1a;LEGB函数的执行流程函数调用的字节码递归&#xff08;Recursion&#xff09;斐波那契数列的递归实现方式递归的要求递归的性能斐波那契数列&#xff0c;递归方式的改进间接递归递归…