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实现进程间通信简单实例
Jul 23 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
python中单下划线_的常见用法总结
Jul 10 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
python DataFrame转dict字典过程详解
Dec 26 Python
Python3如何判断三角形的类型
Apr 12 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Python 字符串池化的前提
Jul 03 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
基于Python实现股票收益率分析
Apr 02 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使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python中使用partial改变方法默认参数实例
2015/04/28 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
django Admin文档生成器使用详解
2019/07/22 Python
python判断无向图环是否存在的示例
2019/11/22 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
大学毕业生工作的自我评价
2013/10/01 职场文书
酒店服务与管理毕业生求职信
2013/11/02 职场文书
人事部主管岗位职责
2013/12/26 职场文书
办理信用卡工作证明
2014/01/11 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
比赛口号霸气押韵
2015/12/24 职场文书