关于类视图选择继承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. ...
随机推荐
- centos7最小化安装无法tab补全
yum install -y bash-completion 安装完后reboot重启生效
- 关于#pragma once和#ifndef
[1]#pragma once这个宏有什么作用? 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式:另一种是#pragma once方式.在能够 ...
- LOJ P10012 Best Cow Fences 题解
每日一题 day48 打卡 Analysis 二分答案,判断序列的平均值是否大于等于mid 具体怎么实现呢? 将序列减去mid,再用前缀和来维护平均值就好了 #include<iostream& ...
- 微软安全技术Shim
Shim是微软系统中一个小型函数库,用于透明地拦截API调用,修改传递的参数.自身处理操作.或把操作重定向到其他地方.Shim主要用于解决遗留应用程序在新版Windows系统上的兼容性问题,但Shim ...
- fake_useragent 本地运行各种报错解决办法
- 使用Sublime Text 写Processing
本来以为是个很简单的事情,没想到一波三折~ 1.下载Sublime Text 3(中文版)并且安装,没啥好说的 2.打开[工具 - 命令面板 - install package],接着就报错了 “Th ...
- Error:(1, 1) java: 非法字符: '\ufeff'
找到 java 文件. 使用 notepad 打开,转码,并保存即可.
- 2019牛客国庆集训派对day1
C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...
- @submit.native.prevent作用
<el-form :inline="true" :model="geCarManageData" class="demo-form-inline ...
- MySQL日常监控及sys库的使用【转】
一.统计信息(SQL维度) 关于SQL维度的统计信息主要集中在events_statements_summary_by_digest表中,通过将SQL语句抽象出digest,可以统计某类SQL语句在各 ...