drf序列化组件之视图家族
一、视图家族的分类
1.导入分类
from rest_framewok import views, generics, mixins, viewsets
views:视图类
两大视图类:APIView、GenericAPIView
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
mixins:视图工具类
六大视图工具类: RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
generics:工具视图类
九大工具视图类:...
from rest_framework import generics
viewsets:视图集
两大视图集基类:ViewSet、GenericViewSet
from rest_framework import viewsets
2.APIVIiew的特性
它继承了Django的View
1)View:将请求方式与视图类的同名方法建立映射,完成请求响应
2)APIView:
继承了View所有的功能;
重写as_view禁用csrf认证;
重写dispatch:请求、响应、渲染、异常、解析、三大认证
多了一堆类属性,可以完成视图类的局部配置
二、views视图类的两大视图类的用法与区别
APIView:
from rest_framework.views import APIView
from rest_framework.response import Response
from . import models,serializers
# APIView:
class StudentAPIView(APIView):
def get(self, request, *args, **kwargs):
# 群查
stu_query = models.Sudent.objects.all()
stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
print(stu_ser)
return Response(stu_ser.data)
GenericAPIView:
# GenericAPIView:
from rest_framework.generics import GenericAPIView
class StudentGenericAPIView(GenericAPIView):
queryset = models.Sudent.objects.all()
serializer_class = serializers.StudentModelSerializer
def get(self, request, *args, **kwargs):
# 群查
# stu_query = models.Sudent.objects.all()
stu_query = self.get_queryset()
# stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
stu_ser = self.get_serializer(stu_query, many=True)
return Response(stu_ser.data)
区别:
1.GenericAPIView继承了APIView,所以它可以用APIView所有的功能
2.GenericAPIView内部提供了三个常用方法:
get_object(): 拿到单个准备序列化的对象,用于单查
get_queryset(): 拿到含有多条数据的Queryset对象,用于群查
get_serializer(): 拿到经过序列化的的serializer对象
3.三个常用属性:
queryset
serializer_class
lookup_url_kwarg
三、视图工具类Mixin的用法与介绍
以单增和群查为例:
from rest_framework import mixins
class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
queryset = models.Sudent.objects.all()
serializer_class = serializers.StudentModelSerializer
# 群查
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
# 单增
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
特点:
1.提供了五大工具类及其六大工具方法:
CreateModelMixin: create() 实现单增
ListModelMixin: list() 实现群查
RetrieveModelMixin:retrieve() 实现单查
UpdateModelMixin: update() 实现单改 和 perform_update() 实现局部改
DestroyModelMixin : destroy() 实现单删
2.只要调用工具类的方法,就可实现该方法的功能,内部的实现原理据说是将我们之前写的代码进行了一层封装,所以我们直接调用即可
3. 由于mixins里的五大工具类没有继承任何视图类views,在配置url的时候没有as_view()方法,也就是不能进行任何的增删改查,所以写视图类时继承GenericAPIView类
四、工具视图类Mixin的用法与介绍
# 工具视图类
from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView,UpdateAPIView,DestroyAPIView
class StudentMixinAPIView(CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView):
queryset = models.Sudent.objects.all()
serializer_class = serializers.StudentModelSerializer
# url中单查,不一定必须提供主键,提供一切唯一键的字段名均可
lookup_url_kwarg = 'id'
# 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除
def destroy(self, request, *args, **kwargs):
pass
分析:
lookup_url_kwarg: url中单查,不一定必须提供主键,提供一切唯一键的字段名均可,url配置中也要将pk改为id
优点:
CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView这五个工具类集成了mixins与GenericAPIView里面的类。将它们再进行一次封装,将get,post...等方法封装起来,我们直接继承有该方法的类即可。
缺点:
单查与群查不能共存,按照继承顺序决定单查还是群查,下面介绍的视图集就能完成共存。
五、视图集的用法与介绍
# 视图集
from rest_framework.viewsets import ModelViewSet
class StudentModelViewSet(ModelViewSet):
queryset = models.Sudent.objects.all()
serializer_class = serializers.StudentModelSerializer
def mypost(self, request, *args, **kwargs):
return Response('my post ok')
分析:
通过使用视图集可以实现单查与群查共存,原因从查看源代码得知:
ModelViewSet继承五大工具类之外还继承了GenericViewSet

GenericViewSet继承了ViewSet再继承了ViewSetMixin
而在ViewSetMixin类里面,它重写了as_view()方法,根据继承关系,如果路由匹配上了,先走ViewSetMixin的as_view()方法。在它的as_view()方法里面,它通过给给as_view()方法传参数的方式,对应的工具方法:

它的原理就是通过给传字典,通过字典里面的数据进行反射,得到请求想要执行的方法。

在url路由中配置,这样我们就可以区别单查与群查了:

我们还可以自己重写请求要执行的对应方法。来实现特殊的需求。
注:由上面的代码可以知道:除了继承APIView的视图类外,其他视图类都要在该类下设置两个属性:
queryset = models.Student.objects.all() # 代表跟哪张表建立关系
serializer_class = serializers.StudentModelSerializer # 指明用的是哪个序列化器
drf序列化组件之视图家族的更多相关文章
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- 19.DjangoRestFramework学习二之序列化组件、视图组件
一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] C ...
- DjangoRestFramework学习二之序列化组件、视图组件
本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: ...
- day 88 DjangoRestFramework学习二之序列化组件、视图组件
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 ...
- DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...
- cvb源码分析,resful规范,drf,drf序列化组件,95
1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...
- DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验
序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...
- DRF 序列化组件 模型层中参数补充
一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...
- 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)
知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...
随机推荐
- Topaz ReMask 5抠图神器
Topaz ReMask 5抠图神器 与Photoshop相比,ReMask不需要繁琐的刷子工作来获得高质量的面膜.您只需粗略勾勒出主题并按"计算"即可. 在Photoshop中制 ...
- myeclipse 在web-inf/lib中导入包
今天用myeclipse的时候发现无法在web-inf/lib导入包,如果直接在工程上导入,则进入了一个referenced libraries的文件夹里,而web-inf/lib里面是没有jar包的 ...
- 玩转 RTC时钟库 DS3231
1.前言 接着博主的上一篇 玩转 RTC时钟库 + DS1302,这一篇我们重点讲解DS3231时钟模块.没有看过上一篇的同学,麻烦先去阅读一下,因为很多理论基础已经在上一篇做了详细讲解,这里 ...
- PHP5底层原理之垃圾回收机制
概念 垃圾回收机制 是一种内存动态分配的方案,它会自动释放程序不再使用的已分配的内存块. 垃圾回收机制 可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑. 与之相关的一个概念,内存 ...
- C#关于private protected sealed Virtual/Override
Public:公开权限 Private:修饰类时类为程序集或者包含此类的类内部权限:修饰变量时只能类内部使用: Protected:修饰变量,只能继承类可以使用,对外(包括继承类的实例)无权限: Ab ...
- net core WebApi——使用xUnits来实现单元测试
目录 前言 单元测试 xUnit 小结 附录 前言 从开始敲代码到现在,不停地都是在喊着记得做测试,记得自测,测试人员打回来扣你money之类的,刚开始因为心疼钱(当然还是为了代码质量),就老老实实自 ...
- Mysql常用数据类型归纳总结1
一直在用Mysql数据库,Mysql的数据类型也最常打交道的.但关于Mysql的一些常用数据类型了解程度仅限于一知半解,仅仅能满足满足于平时一些最简单的操作.而Mysql常用数据类型的定义以及规范理解 ...
- CSPS模拟 96
我菜的一批. 反省一下,我只能在简单场考的好的原因. 过分依赖灵感,不注意积累思路历程和各种套路.没灵感直接崩了 懒得打暴力,主要还是代码能力限制,打暴力真的很费时费力 不打对拍,这个emmm和第二条 ...
- 如何在Vue项目中给路由跳转加上进度条
1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大 ...
- tarjan学习(复习)笔记(持续更新)(各类找环模板)
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...