关于类视图选择继承APIView还是工具视图(ListAPIView、CreateAPIView等等)
APIView使用方法,直接继承APIView,get或者post请求。方法很简单1.先获取到要操作的数据,然后把数据放到serializer中序列化或者反序列化,最后return返回值(记得.data)
1.第一个例子

2.第二个例子

主要流程:获取到数据对象,然后传入到serializer中校验,最后response返回前端数据(注意返回的数据要.data)
工具视图(ListAPIView,CreataAPIView等)
https://www.cnblogs.com/wangcuican/p/11710450.html 工具视图学习资料
我们要知道上面这些工具视图是继承GenericAPIView和Mixins各种工具类的
GenericAPIView
我们要先了解GenericAPIView的用法(比如下面的)(******)
先写GenericAPIView的两个属性:queryset(指明视图需要的数据,这个主要是针对从数据库中获取数据,如果是从前端获取数据就不用写queryset了,数据就从reqeust中获取)和serializer_class(指明视图使用哪个序列化器)
如果你写了上面的两个属性,就必须需要使用get_queryset和get_serializer进行操作(特别需要注意******)
get_queryset功能:从类属性queryset中获取model的queryset数据
get_serializer功能:从类属性serializer_class中获得serializer的序列化类,主要是给Mixin扩展类使用
from rest_framework.generics import GenericAPIView
class BookGenericAPIView(GenericAPIView):
queryset = models.Book.objects.filter(is_delete=False)
serializer_class = serializers.BookModelSerializer
# 自定义主键的 有名分组 名
lookup_field = 'pk' #先定义好,单取可以使用
# 群取
def get(self, request, *args, **kwargs):
book_query = self.get_queryset() #获取queryset数据(model查询数据)
book_ser = self.get_serializer(book_query, many=True) #我的理解是数据被[]嵌套就要写many=True(book_query查出来是queryset类型,如果查出来是object就不用写many=True)
book_data = book_ser.data #返回前台的数据必须需要.data,才能返回(******)
return APIResponse(results=book_data) # 单取
def get(self, request, *args, **kwargs):
book_query = self.get_object()
book_ser = self.get_serializer(book_query)
book_data = book_ser.data
return APIResponse(results=book_data)
Mixins各种工具类(配合GenericAPIView一起使用)
mixins有五个工具类文件,一共提供了五个工具类,六个工具方法:单查、群查、单增、单删、单整体改、单局部改
五个工具类:CreateModelMixin(增加),DestroyModelMixin(删除),ListModelMixin(查询,查queryset),RetrieveModelMixin(查询,查对象,针对于存在"pk"),UpdateModelMixin(修改)
举例子

现在我们就有疑问了,前面说了用GenericAPIView,就必须要get_queryset()和serializer_class()。这里Mixins工具类也使用了GenericAPIView为什么没见这两个方法。
get_queryset()和serializer_class()这两个方法在list,create等源码方法中
源码:(针对增加数据的源码create)这里面用到了get_serializer,所以我们在这之前就必须设定一个serializer_class方法。


举例子:Create增加的用法(这里我们直接用CreateAPIView方法,在源码中已经继承GenericAPIView和Mixin工具类。就不用再去自定义类,然后继承GenericAPIView和Mixin工具类这种麻烦的操作)
from rest_framework.generics import CreateAPIView
class RegisterCreateAPIView(CreateAPIView):
serializer_class = serializers.RegisterModelSerializer #重写create方法,CreateModelMixin中的create方法,下面这段代码是到create源码中粘贴过来的(******)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) # 校验失败就主动抛异常 => 自定义异常结果,配置异常模块
user_obj = serializer.save() # 要自定义入库逻辑,重写serializer中的create方法
headers = self.get_success_headers(serializer.data)
# 响应结果需要格式化,使用序列化类要提供序列化与反序列化两套规则
#返回前端的数据APIResponse
return APIResponse(, 'ok',
results=serializers.RegisterModelSerializer(user_obj).data,
http_status=,
headers=headers
)
这里我们为什么要重写create方法呢,因为想自定义返回值APIResponse,如果你不需要重写方法,那么这个类下面只写queryset和serializer_class这两个属性就行了。
关于类视图选择继承APIView还是工具视图(ListAPIView、CreateAPIView等等)的更多相关文章
- DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集
复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...
- APIView (DRF的视图)
APIView和View的区别 -- APIView继承了View -- APIView 重写了as_view以及 dispatch方法 -- 在dispatch里重新封装了request -- r ...
- 视图家族之mixins视图工具类与generics工具视图类
视图家族之mixins视图工具类与generics工具视图类 一.mixins视图工具类 作用: 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通 ...
- drf二次封装response-APIViews视图家族-视图工具集-工具视图-路由组件
视图类传递参数给序列化类 (1).在视图类中实例化 序列化对象时,可以设置context内容. (2).在序列化类中的局部钩子.全局钩子.create.update方法中,都可以用self.conte ...
- 太多选择——企业如何选择合适的BI工具?
在没认清现状前,企业当然不能一言不合就上BI. BI不同于一般的企业管理软件,不能简单归类为类似用于提高管理的ERP和WMS,或用于提高企业效率的OA.BPM.BI的本质应该是通过展现数据,用于加强企 ...
- Action类为何要继承ActionSupport
Action类为何要继承ActionSupport 理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...
- 如何选择正确的DevOps工具
坦白的讲:世界上没有哪种工具能够像DevOps这么神奇(或敏捷,或精益).DevOps在开发和运营团队之间建立了完美的合作与沟通,因此与其说这是一种神奇的工具,不如说是一种文化的转变. 然而,团队之间 ...
- Qt 学习之路:视图选择 (QItemSelectionModel)
选择是视图中常用的一个操作.在列表.树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/view 架构中,这种选择模型提供了一种 ...
- qt视图选择
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...
随机推荐
- JAVA常用处理数据
price(350)*(10/100) price.multiply(maxPayIntegrateRate.divide(new BigDecimal("100.0")) max ...
- C# await async Task
//原文:https://www.cnblogs.com/yan7/p/8401681.html //原文:https://www.cnblogs.com/s5689412/p/10073507.ht ...
- 浅谈SPFA判负环
目录 SPFA判负环 [前言] [不可代替性] [具体实现] SPFA的过程 判负环 [核心代码] [例题] SPFA判负环 有不足的地方请指出 本蒟蒻一定会修改吼 [前言] 最短路的求法中最广为人知 ...
- 什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?
css引入了@import 或者存在多个style标签以及css文件在页面底部 使得css文件加载在html之后导致页面闪烁.花屏 用link加载css文件,放在head标签里面
- shell脚本编程之变量的小用法
变量赋值 ${parameter:-word}:如果parameter为空或未定义,则变量展开为"word":否则,展开为parameter的值: ${parameter:+wor ...
- GitHub如何删除一个代码仓库
进入GitHub之后,点击“your repositories”查看所有的代码仓库. 在代码仓库中选择一个需要删除的,进入其详情页 在详情页中找到“setting”设置,下拉至最后可以看到删除选项. ...
- 什么是TCP粘包?怎么解决这个问题
在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接.在TCP的socket编程中,发送端和接收端都有成对的socke ...
- jmeter cookie管理器
jmeter cookie管理器 不能用正则表达式获取登录接口生成的cookie 因为cookies并不是在登录的响应结果中生成的,而是在response header中携带的,所以不能用正则表达式提 ...
- CMU Database Systems - Database Recovery
数据库数据丢失的典型场景如下, 数据commit后,还没有来得及flush到disk,这时候crash就会丢失数据 当然这只是fail的一种情况,DataBase Recovery要讨论的是,在各种f ...
- echo * 和ls *之间的区别?
背景描述: 今天 一同事做入职考试,涉及到1题目,echo * 和ls *之间的区别,没有用过这个用法,再次记录下. 操作过程: 1.执行echo * [root@localhost ~]# echo ...