介绍

关于mixin,mix in是一种提供基础口味的冰淇淋(如香草,巧克力),可以往上添加坚果,饼干等。mixin作为扩展类通常用于多继承问题。多继承是Python语言的特色。一般通过继承或重写来使用它的功能函数,而不是单独作为类使用。

视图说明

1. 两个基类

1)APIView

rest_framework.views.APIViewi

APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

APIViewView的不同之处在于:

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

支持定义的属性:

  • authentication_classes 列表或元祖,身份认证类
  • permissoin_classes 列表或元祖,权限检查类
  • throttle_classes 列表或元祖,流量控制类

APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。

举例:

from rest_framework.views import APIView

from rest_framework.response import Response

# url(r'^books/$', views.BookListView.as_view()),

class BookListView(APIView):

def get(self, request):

books = BookInfo.objects.all()

serializer = BookInfoSerializer(books, many=True)

return Response(serializer.data)

2)GenericAPIView

rest_framework.generics.GenericAPIView

继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。

支持定义的属性:

  • 列表视图与详情视图通用:

    • queryset 列表视图的查询集
    • serializer_class 视图使用的序列化器
  • 列表视图使用:
    • pagination_class 分页控制类
    • filter_backends 过滤控制后端
  • 详情页视图使用:
    • lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
    • lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同

提供的方法:

  • 列表视图与详情视图通用:

    • get_queryset(self)

      返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

    • def get_queryset(self):

      user = self.request.user

      return user.accounts.all()

    • get_serializer_class(self)

      返回序列化器类,默认返回serializer_class,可以重写,例如:

    • def get_serializer_class(self):

      if self.request.user.is_staff:

      return FullAccountSerializer

      return BasicAccountSerializer

    • get_serializer(self, args, *kwargs)

      返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。

      注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

  • 详情视图使用:

    • get_object(self) 返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。

      若详情访问的模型类对象不存在,会返回404。

      该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

举例:

# url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),

class BookDetailView(GenericAPIView):

queryset = BookInfo.objects.all()

serializer_class = BookInfoSerializer

def get(self, request, pk):

book = self.get_object()

serializer = self.get_serializer(book)

return Response(serializer.data)

2. 五个扩展类

1)ListModelMixin

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

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

源代码:

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

class BookListView(ListModelMixin, GenericAPIView):

queryset = BookInfo.objects.all()

serializer_class = BookInfoSerializer

def get(self, request):

return self.list(request)

2)CreateModelMixin

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

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

源代码:

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 {}

3) RetrieveModelMixin

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

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

源代码:

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)

举例:

class BookDetailView(RetrieveModelMixin, GenericAPIView):

queryset = BookInfo.objects.all()

serializer_class = BookInfoSerializer

def get(self, request, pk):

return self.retrieve(request)

4)UpdateModelMixin

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

同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。

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

源代码:

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)

5)DestroyModelMixin

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

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

源代码:

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()

3. 几个可用子类视图

1) CreateAPIView

提供 post 方法

继承自: GenericAPIView、CreateModelMixin

2)ListAPIView

提供 get 方法

继承自:GenericAPIView、ListModelMixin

3)RetireveAPIView

提供 get 方法

继承自: GenericAPIView、RetrieveModelMixin

4)DestoryAPIView

提供 delete 方法

继承自:GenericAPIView、DestoryModelMixin

5)UpdateAPIView

提供 put 和 patch 方法

继承自:GenericAPIView、UpdateModelMixin

6)RetrieveUpdateAPIView

提供 get、put、patch方法

继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

7)RetrieveUpdateDestoryAPIView

提供 get、put、patch、delete方法

继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

jango-简单的mixin扩展类相关推荐

  1. php批量新增数据类型,Yii框架批量插入数据扩展类的简单实现方法

    本文实例讲述了Yii框架批量插入数据扩展类的简单实现方法.分享给大家供大家参考,具体如下: MySQL INSERT语句允许插入多行数据,如下所示: INSERT INTO tbl_name (a,b ...

  2. python动态创建类_Python中通过参数动态创建扩展类(class)

    class Bar: def super_cool_function(self): print("Cool") 1.利用Python闭包动态扩展类 通过在内部创建并从函数返回它来动 ...

  3. objective-c中Category类别(扩展类)专题总结

    objective-c中Category类别(扩展类)专题总结 objective-c中Category 类别.扩展 专题总结 http://blog.csdn.net/jiajiayouba/art ...

  4. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  5. MD5计算,一个扩展类,哪里都能用

    最近有同学问到如何计算一个字节数组的MD5值,现在分享一个扩展类,有了它,MD5计算再也不用其他了. 先看示例: string s = "hello world";var s_md ...

  6. rest_framework05:GenericAPIView用法/扩展类5个/子类9个/ViewSetMixin 自定义方法名字

    GenericAPIView 1.视图层类使用GenericAPIView继承,能简化类里的方法code. 2.简化后的方法code格式基本通用,简单修改即可应用到其他类. 一.class开始加入 q ...

  7. Thinkphp5.0 阿里云OSS扩展类上传示例(轮子)

    转载请声明出处! 环境必须:阿里云OSS php SDK 阿里云OSS php SDK地址:https://github.com/aliyun/aliyun-oss-php-sdk?spm=a2c4g ...

  8. jsonarray转化list对象_第8篇:Cython的面向对象--Python类 vs Cython扩展类

    在Python中,一切都是对象. 具体来说是什么意思? 在最基本的层面上,一个对象具有三样东西 标识(id):对象的标识将其与其他对象区分开来,并由id内置函数提供 属性值(value):对象的值就是 ...

  9. Dubbo SPI机制(上):一个普通的扩展类是如何加载的

    这一篇我们先不讲Dubbo中的具体业务逻辑,我们来打基础,聊一聊Dubbo中的SPI机制. Dubbo SPI是干啥的 了解一个技术,得先知道它是为了解决什么问题而产生的.那么Dubbo SPI是干什 ...

最新文章

  1. MySQL 8.0 Invisible Indexes 和 RDS 5.6 Invisible Indexes介绍
  2. jquery 设置checkbox的checked属性 总是出问题
  3. Github 优秀开源项目 Best Open Source Projects
  4. 查看是否由两个单词组成
  5. ruby hash方法_Ruby中带有示例的Hash.select方法
  6. 十六进制除法运算法则_苏教版数学七年级上册 微课视频 2.6 有理数的乘法与除法(1)...
  7. 信息学奥赛一本通 2042:【例5.10】稀疏矩阵
  8. declare sql语句_SQL高级知识——动态SQL
  9. 3ds max学习笔记(二)--查看视点
  10. Shadow Defender影子卫士
  11. python能代替做表格吗_做报表三年却被淘汰:别学python和Excel,这才是你该会的工具...
  12. 【20考研】如何度过一个有意义的寒假?
  13. Fiddle过滤设置
  14. keil编程问题 -- main.c(75): warning: #223-D: function “XXX“ declared implicitly
  15. 新浪微博iOS客户端架构与优化之路
  16. 如何快速创建在线员工培训课程
  17. 小米路由器3安装opkg指南
  18. 解决方案,关于电子商务
  19. MySQL 面试题(一):索引失效的几种情况
  20. 网络服务之nginx详解

热门文章

  1. 华为运动手表HUAWEI WATCH GT3恢复心率功能实测详解
  2. < 数据结构 > 堆的应用 --- 堆排序和Topk问题
  3. SDWebUI:AI绘图本地部署及绘图效率实验
  4. 学历,对于程序员来说,到底有重要?
  5. Dataguard基本简介及三大保护模式介绍
  6. ubuntu_ros+solidworks+ubuntu_raspberryPi3+arduino_mega机器人仿真实际系统搭建
  7. oracle nls calendar,Oracle的NLS设置
  8. 校内BT下载统计分析
  9. 吃瓜教程task03 第4章 决策树
  10. Oracle Database 12c Attribute Cluster 和 Zone Map 高阶实验