Django视图扩展类知识点详解


Posted in Python onOctober 25, 2019

扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer

需要自定义get、post等请求方法,内部实现调用扩展类对应方法即可 。

一、mixins的视图子类

作用:

提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量 。

这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。

1.1 ListModelMixin

列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。

  • 提供list方法,快速实现列表视图
  • 调用GenericAPIView设置好的结果集
  • 调用GenericAPIView设置好的序列化器

该Mixin的list()方法会对数据进行过滤和分页。

源代码:

from rest_framework.mixins import ListModelMixin

class ListModelMixin(object):
  """
  List a queryset.
  """
  def list(self, request, *args, **kwargs):
    # 过滤
    queryset = self.filter_queryset(self.get_queryset())
    # 分页
    page = self.paginate_queryset(queryset)
    if page is not None:
      serializer = self.get_serializer(page, many=True)
      return self.get_paginated_response(serializer.data)
    # 序列化
    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

举例:

from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView

class BookListView(ListModelMixin, GenericAPIView):
  queryset = BookInfo.objects.all()
  serializer_class = BookInfoSerializer

  def get(self, request):
    return self.list(request)

1.2 CreateModelMixin
创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。

  • 提供create(request, *args, **kwargs)方法快速实现创建资源的视图
  • 实际创建功能由序列化的save方法完成
  • save方法会去调用序列化器的create方法

如果序列化器对前端发送的数据验证失败,返回400错误。

源代码:

from rest_framework.mixins import CreateModelMixin

class CreateModelMixin(object):
  """
  Create a model instance.
  """
  def create(self, request, *args, **kwargs):
    # 获取序列化器
    serializer = self.get_serializer(data=request.data)
    # 验证
    serializer.is_valid(raise_exception=True)
    # 保存
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

  def perform_create(self, serializer):
    serializer.save()

  def get_success_headers(self, data):
    try:
      return {'Location': str(data[api_settings.URL_FIELD_NAME])}
    except (TypeError, KeyError):
      return {}

1.3 RetrieveModelMixin

详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。

如果存在,返回200, 否则返回404。

源代码:

from rest_framework.mixins import RetrieveModelMixin

class RetrieveModelMixin(object):
  """
  Retrieve a model instance.
  """
  def retrieve(self, request, *args, **kwargs):
    # 获取对象,会检查对象的权限
    instance = self.get_object()
    # 序列化
    serializer = self.get_serializer(instance)
    return Response(serializer.data)

举例:

from rest_framework.mixins import RetrieveModelMixin
from rest_framework.generics import GenericAPIView

class BookDetailView(RetrieveModelMixin, GenericAPIView):
  queryset = BookInfo.objects.all()
  serializer_class = BookInfoSerializer

  def get(self, request, pk):
    return self.retrieve(request)

1.4 UpdateModelMixin
更新视图扩展类,提供update(request, *args, **kwargs)方法

  • 可以快速实现更新一个存在的数据对象。
  • 同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。
  • 内部更新功能调用序列化器的save方法
  • save方法会调用序列化器的update方法

成功返回200,序列化器校验数据失败时,返回400错误。

源代码:

from rest_framework.mixins import UpdateModelMixin

class UpdateModelMixin(object):
  """
  Update a model instance.
  """
  def update(self, request, *args, **kwargs):
    partial = kwargs.pop('partial', False)
    instance = self.get_object()
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    serializer.is_valid(raise_exception=True)
    self.perform_update(serializer)

    if getattr(instance, '_prefetched_objects_cache', None):
      # If 'prefetch_related' has been applied to a queryset, we need to
      # forcibly invalidate the prefetch cache on the instance.
      instance._prefetched_objects_cache = {}

    return Response(serializer.data)

  def perform_update(self, serializer):
    serializer.save()

  def partial_update(self, request, *args, **kwargs):
    kwargs['partial'] = True
    return self.update(request, *args, **kwargs)

1.5 DestroyModelMixin

删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。

成功返回204,不存在返回404。

源代码:

from rest_framework.mixins import DestroyModelMixin

class DestroyModelMixin(object):
  """
  Destroy a model instance.
  """
  def destroy(self, request, *args, **kwargs):
    instance = self.get_object()
    self.perform_destroy(instance)
    return Response(status=status.HTTP_204_NO_CONTENT)

  def perform_destroy(self, instance):
    instance.delete()

使用GenericAPIView和视图扩展类,实现api接口,代码:

"""GenericAPIView结合视图扩展类实现api接口"""
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin,CreateModelMixin

class Students2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin):
  # 本次视图类中要操作的数据[必填]
  queryset = Student.objects.all()
  # 本次视图类中要调用的默认序列化器[玄天]
  serializer_class = StudentModelSerializer

  def get(self, request):
    """获取多个学生信息"""
    return self.list(request)

  def post(self,request):
    """添加学生信息"""
    return self.create(request)
from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.generics import GenericAPIView

class Student2GenericAPIView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
  queryset = Student.objects.all()

  serializer_class = StudentModelSerializer

  # 在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk
  def get(self,request,pk):
    """获取一条数据"""
    return self.retrieve(request,pk)

  def put(self,request,pk):
    """更新一条数据"""
    return self.update(request,pk)

  def delete(self,request,pk):
    """删除一条数据"""
    return self.destroy(request,pk)

二 、Generic的视图子类

2.1 CreateAPIView

提供 post方法

继承自: GenericAPIView、`CreateModelMixin

2.2 ListAPIView

提供 get 方法

继承自:GenericAPIView、ListModelMixin

2.3 RetrieveAPIView

提供 get方法

继承自: GenericAPIView、RetrieveModelMixin

2.4 DestoryAPIView

提供 delete方法

继承自:GenericAPIView、DestoryModelMixin

2.5 UpdateAPIView

提供 put和 patch方法

继承自:GenericAPIView、UpdateModelMixin

2.6 RetrieveUpdateAPIView

提供 get、put、patch方法

继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

2.7 RetrieveUpdateDestoryAPIView

提供 get、put、patch、delete方法

继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

以上就是本次介绍的全部知识点内容,感谢大家的学习和对三水点靠木的支持。

Python 相关文章推荐
python实现上传样本到virustotal并查询扫描信息的方法
Oct 05 Python
Python加pyGame实现的简单拼图游戏实例
May 15 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python实现的递归神经网络简单示例
Aug 11 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
总结Python变量的相关知识
Jun 28 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 #Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 #Python
Python下应用opencv 实现人脸检测功能
Oct 24 #Python
Python迭代器iterator生成器generator使用解析
Oct 24 #Python
Python 取numpy数组的某几行某几列方法
Oct 24 #Python
Django和Flask框架优缺点对比
Oct 24 #Python
python命令 -u参数用法解析
Oct 24 #Python
You might like
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
小程序Request的另类用法详解
2019/08/09 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
最基础的Python的socket编程入门教程
2015/04/23 Python
Python正则表达式经典入门教程
2017/05/22 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
2015年征兵工作总结
2015/07/23 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
python自动化之如何利用allure生成测试报告
2021/05/02 Python
如何在Python中妥善使用进度条详解
2022/04/05 Python