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等等)的更多相关文章

  1. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  2. APIView (DRF的视图)

    APIView和View的区别 -- APIView继承了View -- APIView 重写了as_view以及 dispatch方法 -- 在dispatch里重新封装了request  -- r ...

  3. 视图家族之mixins视图工具类与generics工具视图类

    视图家族之mixins视图工具类与generics工具视图类 一.mixins视图工具类 作用: 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通 ...

  4. drf二次封装response-APIViews视图家族-视图工具集-工具视图-路由组件

    视图类传递参数给序列化类 (1).在视图类中实例化 序列化对象时,可以设置context内容. (2).在序列化类中的局部钩子.全局钩子.create.update方法中,都可以用self.conte ...

  5. 太多选择——企业如何选择合适的BI工具?

    在没认清现状前,企业当然不能一言不合就上BI. BI不同于一般的企业管理软件,不能简单归类为类似用于提高管理的ERP和WMS,或用于提高企业效率的OA.BPM.BI的本质应该是通过展现数据,用于加强企 ...

  6. Action类为何要继承ActionSupport

    Action类为何要继承ActionSupport   理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...

  7. 如何选择正确的DevOps工具

    坦白的讲:世界上没有哪种工具能够像DevOps这么神奇(或敏捷,或精益).DevOps在开发和运营团队之间建立了完美的合作与沟通,因此与其说这是一种神奇的工具,不如说是一种文化的转变. 然而,团队之间 ...

  8. Qt 学习之路:视图选择 (QItemSelectionModel)

    选择是视图中常用的一个操作.在列表.树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/view 架构中,这种选择模型提供了一种 ...

  9. qt视图选择

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...

随机推荐

  1. Oracle 查看index是否失效

    一.普通索引是否失效 select * from dba_indexes s where s.owner  in ('ISMP','BOSS','PAY','ACCOUNT','SETTLE','TE ...

  2. 洛谷P1902 刺杀大使

    题目 二分加广搜 #include <bits/stdc++.h> using namespace std; int n, m, l, r, p[1001][1001], vis[1001 ...

  3. ASP复古随机验证码

    <% Call Com_CreatValidCode("ValidCode") Sub Com_CreatValidCode(pSN) Response.Expires = ...

  4. 「2019-8-13提高模拟赛」树 (tree)

    传送门 Description 你有一个 \(n\)个点的树,第 \(i\)个点的父亲是\(p_i\).每个点有一个权值 \(t_i\) 和一个颜色黑或者白.所有点一开始都是白色. 你要进行 \(m\ ...

  5. 工作发狂:Mybatis 中$和#千万不要乱用!

    阅读本文大概需要 2.2 分钟. 作者:程序猿的内心独白 开头 这是一次代码优化过程中发现的问题,在功能优化后发现部分数据查不到出来了,问题就在于一条sql上的#和$. 下图为两条sql: 从图上可以 ...

  6. git 全量同步分支

    当前分支是maser分支,我想将stable分支上的代码完全覆盖brush分支,首先切换到brush分支. git reset --hard origin/stable 执行上面的命令后brush分支 ...

  7. Jmeter工具功能介绍

    可以去官方学习:http://jmeter.apache.org/ 1.可以修改语言 2.部分图标功能 新建 打开一个jmeter脚本 保存一个jmeter脚本 剪切 复制 粘贴 展开目录树 收起目录 ...

  8. Java的死锁及解决思路(延伸: 活锁,饥饿,无锁)

    死锁: A线程持有 锁1,接下来要获取锁2:与此同时,B线程持有锁2,要获取锁1.两个线程都在等对方释放自己需要的锁,这时两方会永远等待下去,就形成了死锁. 死锁的四个必要条件: 1.互斥:资源(锁) ...

  9. mysql死锁(锁与事务)

    线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”. Oh, My God! 是死锁问题.尽管报错不多,对性能目前看来 ...

  10. Spring的异步方法

    先把longTimeMethod 封装到Spring的异步方法中,这个异步方法的返回值是Future的实例.这个方法一定要写在Spring管理的类中,注意注解@Async. @Service publ ...