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 多进程通信模块的简单实现
Feb 20 Python
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
几种实用的pythonic语法实例代码
Feb 24 Python
python版飞机大战代码分享
Nov 20 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
python实现ip代理池功能示例
Jul 05 Python
Python的numpy库下的几个小函数的用法(小结)
Jul 12 Python
python SocketServer源码深入解读
Sep 17 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 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中文本操作的类
2007/03/17 PHP
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
Python群发邮件实例代码
2014/01/03 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Python如何省略括号方法详解
2020/03/21 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
设计部经理的岗位职责
2013/11/16 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
研修心得体会
2014/09/04 职场文书
党员个人剖析材料
2014/09/30 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers