文章目录

  • 一、Generics:工具视图
    • 1.群查与单增:ListCreateAPIView
        • 查看源码
        • 代码实现
      • 测试接口
    • 2.添加其他接口
      • 代码实现
      • 接口测试
    • 3.后续问题
  • 二、Viewsets:视图集
    • 1.简单使用
      • 查看源码
      • 代码实现
    • 2.ModelViewSet:最全的封装类
      • 查看源码
      • 代码实现
      • 接口测试
        • 群查
        • 单查
        • 单删
        • 单增
  • 总结
    • GenericAPIView 与 APIView 的区别与适用场景
      • 1. GenericAPIView 视图类
      • 2. APIView 视图类

一、Generics:工具视图

generics 是工具视图,可以实现极简化接口编写操作。

工具视图都是 GenericAPIView 的子类,不同的子类继承不同工具类,重写请求方法。

1.群查与单增:ListCreateAPIView

查看源码
# 继承了视图基类 GenericAPIView,工具类 ListModelMixin,CreateModelMixin实现群查和单增
class ListCreateAPIView(mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView):"""Concrete view for listing a queryset or creating a model instance."""# 群查def get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)# 单增def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)
代码实现

urls.py

from django.conf.urls import url, includefrom api import viewsurlpatterns = [url(r'^v4/books/$', views.BookListCreateView.as_view()),url(r'^v4/books/(?P<pk>.*)/$', views.BookListCreateView.as_view()),
]

工具视图的功能如果满足需求,只需要继承工具视图,添加 queryset,serializer_class

views.py

class BookListCreateView(ListCreateAPIView):queryset = models.Book.objects.filter(is_delete=False)serializer_class = serializers.BookModelSerializer

测试接口

群查

单增

入库成功

其他方法

根据上述源码分析与示例和下面的图示,我们可以很容易知道这些类的功能和用法

2.添加其他接口

代码实现
# 需要什么接口,直接继承就行
# 比如我们在群查,单增的基础上,添加单改接口
class BookListCreateView(ListCreateAPIView, UpdateAPIView):queryset = models.Book.objects.filter(is_delete=False)serializer_class = serializers.BookModelSerializer
接口测试

修改成功

3.后续问题

但是上述虽然可以实现简单接口,但是有时候需求会很复杂。

比如,来自前端用户的数据格式并不是和我们规定的一样,有可能传来空值,错误字符等等。这就需要对 request.data 进行过滤,尤其是在入库的时候。

另外,如果数据有误,DRF 并不知道你的字段是哪出的问题,所以抛异常是只会是数据错误。我们需要对每个字段的每种错误类型给出对应的返回值。

可以在 UpdateModelMixin 源码中看到,request.data 并没有进行过滤。

class UpdateModelMixin:def update(self, request, *args, **kwargs):partial = kwargs.pop('partial', False)instance = self.get_object()# request.data 并没有进行过滤serializer = self.get_serializer(instance, data=request.data, partial=partial)# ...

二、Viewsets:视图集

1.简单使用

DRF 提供了 Viewsets.py 视图集,再次封装之前的操作。最主要的是,可以通过设置 请求-函数 映射关系,来将请求方式与原有方法或自定义方法对应执行。

查看源码

发现没有提供实际的方法

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):"""The GenericViewSet class does not provide any actions by default,but does include the base set of generic view behavior, such asthe `get_object` and `get_queryset` methods."""pass

但是看到它继承了 ViewSetMixin,GenericAPIView

查看 ViewSetMixin 类的 as_view 方法

GenericViewSet 和 ViewSet 都继承了 ViewSetMixin,as_view 可以配置 请求-函数 映射

比如view = MyViewSet.as_view({'get': 'list', 'post': 'create'})

class ViewSetMixin:@classonlymethoddef as_view(cls, actions=None, **initkwargs):#...def view(request, *args, **kwargs):# 这里 cls 去解析前边例子中的 {'get': 'list', 'post': 'create'}self = cls(**initkwargs)self.action_map = actions# methods拿到请求方法,比如getfor method, action in actions.items():handler = getattr(self, action)# 映射method get到执行函数handler listsetattr(self, method, handler)if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargs# 继承 APIView 中的 dispatch 进行分发return self.dispatch(request, *args, **kwargs)# ...
代码实现

这样的好处是,各种需求的接口的请求方式都可以用不同函数定义返回值。比如十大接口对应十个函数,分别码代码。

views.py

class BookGenericViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):queryset = models.Book.objects.filter(is_delete=False)serializer_class = serializers.BookModelSerializerdef get_list(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def get_obj(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)

urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from django.views.static import serve
from django.conf import settingsfrom api import viewsurlpatterns = [# ...url(r'^v5/books/$', views.BookGenericViewSet.as_view({'get':'get_list'})),url(r'^v5/books/(?P<pk>.*)/$', views.BookGenericViewSet.as_view({'get':'get_obj'})),
]

2.ModelViewSet:最全的封装类

查看源码
class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet):"""A viewset that provides default `create()`, `retrieve()`, `update()`,`partial_update()`, `destroy()` and `list()` actions."""pass
代码实现

views.py

# 继承 ModelViewset 会直接拥有六大接口:单查,群查,单增,单删,单整体改,单局部改
# 需要注意:Destroy 需要重写
class BookModelViewSet(ModelViewSet):queryset = models.Book.objects.filter(is_delete=False)serializer_class = serializers.BookModelSerializer# 删除操作def destroy(self, request, *args, **kwargs):instance = self.get_object() # type: models.Bookif not instance:return APIResponse(1, "Delete fail")instance.is_delete = Trueinstance.save()return APIResponse(1, "Delete successful")

urls.py

from django.conf.urls import urlfrom api import viewsurlpatterns = [url(r'^v6/books/$', views.BookModelViewSet.as_view({'get':'list', 'post':'create'})),url(r'^v6/books/(?P<pk>.*)/$', views.BookModelViewSet.as_view({'get': 'retrieve', 'post':'create', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
]
接口测试
群查

单查

单删


查看数据库

单增

入库成功

等等

总结

GenericAPIView 与 APIView 的区别与适用场景

1. GenericAPIView 视图类

GenericView 继承 GenericAPIView 视图类

适用于标准的接口请求,或实现标准的 Model 类操作接口。

案例: 用户查询时,发送 GET 请求,返回数据。

2. APIView 视图类

ViewSet 继承 APIView 视图类

实现不需要 Model 类操作,或非标准的 Model 类操作接口。比如,POST请求在标准的 Model 类操作用于新增接口,但以下案例并不符合这个标准。

案例 1: 请求手机验证码时,发送 POST 请求,不需要 Model 类的参与。

案例 2: 用户登录时,发送的 POST 请求,并不是完成数据的新增。POST 只是用于提交数据,返回值也不是登录用户信息,而是登录的认证信息。

Django REST 框架详解 06 | 视图家族 Generics 与 Viewsets相关推荐

  1. Django REST 框架详解 07 | 三大认证与权限六表

    文章目录 一.三大认证 1. 认证组件:校验用户 2. 权限组件:校验用户权限 3. 频率组件:限制视图接口被访问次数 4. 分析源码 二.权限六表 1. RBAC 认证 2. 权限三表 3. 权限五 ...

  2. Django REST 框架详解 03 | 模型建立与表设计

    文章目录 一.设计表 二.表关系 1.表关系设置 2.断开表关联 三.级联操作 1.CASCADE 2.SET_NULL 3.SET_DEFAULT 4.DO_NOTHING 四.Admin 一.设计 ...

  3. Qt图形视图框架详解-安晓辉-专题视频课程

    Qt图形视图框架详解-12227人已学习 课程介绍         介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...

  4. Django REST FRAMEWORK swagger(一)框架详解

    Django REST FRAMEWORK swagger(一.框架详解) 一.Django REST  SWAGGER框架图 具体见下图 二.说明 RESTFul说明 每一个URI代表一种资源: 客 ...

  5. shiro放行_Shiro框架详解 tagline

    部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA 密码:jsam 想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复" ...

  6. springboot2整合mysql5_SpringBoot2整合SSM框架详解

    SpringBoot2整合SSM框架详解 发布时间:2019-01-15 21:33, 浏览次数:1218 , 标签: SpringBoot SSM <>开发环境 * 开发工具:Eclip ...

  7. 框架详解_Qt开发技术:QtCharts(一)QtCharts基本介绍以及图表框架详解

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  8. iOS中ImageIO框架详解与应用分析

    2019独角兽企业重金招聘Python工程师标准>>> iOS中ImageIO框架详解与应用分析 一.引言 ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到 ...

  9. 【传智播客郑州校区分享】AndroidAnnotations框架详解

    AndroidAnnotations框架详解 文/传智播客郑州中心就业服务部 简介 在之前的开发中,你肯定用到了xUtils及ButterKnife等依赖注入框架,你可以使用这些框架来简化你的代码,因 ...

最新文章

  1. 树中两个结点的最低公共祖先
  2. JS中怎样将时间字符串转换成Date并比较大小
  3. how is SAP ui5 formatter resolved
  4. 基于DeepConvLSTM的传感器信号分类
  5. Python 数据分析三剑客之 NumPy(三):数组的迭代与位运算
  6. 你看,那个人好像一条狗哎
  7. 理解JESD204B链路参数 Understanding JESD204B Link Parameters
  8. 随机过程(联合平稳随机过程)
  9. Android之---揭秘微信不死的进程
  10. 编程思想的理解(POP,OOP,SOA,AOP)
  11. mac地址储存在计算机的内存,mac地址存储在
  12. IOS APP资源网站汇总
  13. Elasticsearch:创建 API key 接口访问 Elasticsearch
  14. python plt.imshow函数显示图像颜色失真
  15. C语言实现float类型到int类型的转化(位运算基础知识)
  16. 提质信创•协同发展—— 麒麟信安云+操作系统交流会(武汉站)顺利举行
  17. 高防cdn的构建简单吗?高防cdn有什么优势?
  18. 2017微信公开课·张小龙演讲全文(下)
  19. LightningChart® JS BS端结合框架模拟心电图实例
  20. [磁盘清理] Windows Server 2003 系统盘清理

热门文章

  1. fc2 php,fc2fans_club.py
  2. 架构17 社交软件红包技术10
  3. 读书笔记《世界金融史》
  4. 零起步的HMTL了解了解?
  5. 1. Stateflow - 基本概念,界面介绍
  6. php实现手机归属地的查询,PHP实现手机归属地查询API接口
  7. 清理C盘垃圾文件的快速方式
  8. xpath获取两个标签之间的内容
  9. 结婚美丽守则,拍婚纱照的贴心提醒
  10. 炒股的智慧:股票投资93条秘籍