关于类视图选择继承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. ...
随机推荐
- How to change hostname on debian
How to change hostname on Debian 10 Linux last updated July 13, 2019 in CategoriesDebian / Ubuntu, L ...
- pgloader 学习(二)特性矩阵&&命令行
pgloader 对于各种数据库支持的还是很完整的,同时有一套自己的dsl 特性矩阵 操作命令 命令格式 pgloader [<options>] [<command-file> ...
- 2-移远GSM/GPRS M26 模块 Mini板 开发板(M26入门)
https://www.cnblogs.com/yangfengwu/p/11214553.html 资料获取,首先说一下....很多东西需要自己悟,没有QQ群,没有微信群,论坛也寥寥无几!!!! 估 ...
- 【loj2339】【WC2018】通道
题目 三棵带边权的树,求 \[ dis1(u,v) + dis2(u,v) + dis3(u,v) \] 的最大值 \(1 \le n \le 10^5\) 题解 对\(T_1\)做边分治,把分治边的 ...
- CMD下文件操作
CMD下常用文件操作指令 1.输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录) 2.输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径).如cd mm ...
- mysql mod() 获取余数
mysql> ,); +-----------+ | mod(,) | +-----------+ | | +-----------+ row in set (0.00 sec)
- Vue.js2.5+cube-ui重构饿了么App*下载
第1章 课程导学 第2章 项目准备工作 第3章 头部组件开发 第4章 Tab 组件开发 第5章 商品页面开发 第6章 商品详情页开发 第7章 评价和商家页面开发 第8章 create-api 原理分析 ...
- D3.js的v5版本入门教程(第八章)—— 坐标轴
D3.js的v5版本入门教程(第八章) D3中没有现成的坐标轴图形,需要我们自己用其他组件拼凑而成.D3中提供了坐标轴组件,使得我们在SVG中绘制一个坐标轴变得像添加一个普通元素那样简单 为了表绘制一 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- Linux下查看目录文件数和文件大小
一.查看当前目录下文件个数 在linux下查看目录下有多少文件可以用:ls -l 命令查看,ls -lR 递归查看所有目录, 如果文件很多,则用wc命令 和 grep 命令进行过滤. wc命令显示输 ...