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中文字符串截取问题
Jun 15 Python
利用Python获取操作系统信息实例
Sep 02 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
python之pexpect实现自动交互的例子
Jul 25 Python
python3.6编写的单元测试示例
Aug 17 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
pycharm 快速解决python代码冲突的问题
Jan 15 Python
用Python实现Newton插值法
Apr 17 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禁止个别IP访问网站
2013/10/30 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
设定php简写功能的方法
2019/11/28 PHP
jquery cookie插件代码类
2009/05/26 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
Python中使用ElementTree解析XML示例
2015/06/02 Python
python中执行shell的两种方法总结
2017/01/10 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
Python装饰器结合递归原理解析
2020/07/02 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
Django url 路由匹配过程详解
2021/01/22 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
学雷锋志愿服务月活动总结
2014/03/09 职场文书
法人授权委托书
2014/04/03 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
公司演讲稿开场白
2014/08/25 职场文书
委托书怎样写
2014/08/30 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python