一、视图家族的分类

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序列化组件之视图家族的更多相关文章

  1. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  2. 19.DjangoRestFramework学习二之序列化组件、视图组件

    一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] C ...

  3. DjangoRestFramework学习二之序列化组件、视图组件

    本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: ...

  4. day 88 DjangoRestFramework学习二之序列化组件、视图组件

    DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 ...

  5. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  6. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  7. DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验

    序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...

  8. DRF 序列化组件 模型层中参数补充

    一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...

  9. 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)

    知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...

随机推荐

  1. SpringBoot中如何灵活的实现接口数据的加解密功能?

    数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...

  2. 使用 Hexo,Material Theme 以及 Github Pages 搭建个人博客

    准备条件 Node.js npm Git GitHub账号 开始搭建 hexo init Blog cd Blog npm install hexo-deployer-git --save npm i ...

  3. Redis(十四)Redis 在Java Web 中的应用

    在传统的 Java Web 项目中,使用数据库进行存储数据,但是有一些致命的弊端,这些弊端主要来自于性能方面. 由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般管理系统中,由于不存在高 ...

  4. SpringBoot与MybatisPlus整合之公用字段填充(十一)

    在实际开发中,适合用于记录创建人修改人 pom.xml <dependencies> <dependency> <groupId>org.springframewo ...

  5. ORM之单表操作

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  6. 前端技术之:通过plop生成Controller的方法与步骤

    # Controller的生成 开发者可以通过plop命令生成各种类型的控制器类(Normal.Restful.View), 以下是示例生成步骤. 1. 执行以下命令: plop controller ...

  7. Python监控SQL Server数据库服务器磁盘使用情况

    本篇博客总结一下Python采集SQL Server数据库服务器的磁盘使用信息,其实这里也是根据需求不断推进演化的一个历程,我们监控服务器的磁盘走了大概这样一个历程: 1:使用SQL Server作业 ...

  8. 【IOS开发学习—OC篇】

    一.instancetype和id关键字的区别 1)instancetype表示方法的返回类型和调用方法的对象类型相同. 2)在Object-C引入instancetype之前,初始化方法的返回类型都 ...

  9. 九:写了一下红帽免费的centos6的安装步骤

    linux centos 6安装方法 前提需要: 1, centos6的镜像文件 2,VMware 提前安装 注:获取镜像 阿里开源系统,此处可下载其他的 1.Ubuntu 2.Susa 3.Cent ...

  10. 你了解MySQL中的日志吗?

    MySQL中有两类非常重要的日志,一类是redo log(重做日志),一类是bin log(归档日志) redo log 重做日志利用的,是MySQL中,常见的WAL技术,WAL技术的全程是:Writ ...