本篇对drf中的mixins进行简要的分析总结。

from rest_framework import viewsets

在这个viewsets中,只有5类Minxin,他们与http方法对应如下:


下面,我们将逐个Mixins介绍!

1. CreateModelMixin

# 源码
class CreateModelMixin(object):"""Create a model instance ==>创建一个实例"""def create(self, request, *args, **kwargs):# 获取相关serializerserializer = self.get_serializer(data=request.data)# 进行serializer的验证# raise_exception=True,一旦验证不通过,不再往下执行,直接引发异常serializer.is_valid(raise_exception=True)# 调用perform_create()方法,保存实例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 {}


由上图可以看出这个类的一个逻辑,其中,perform_create( )对serializer直接进行save保存,当在一些情境下,我们需要对perform_create( )进行重写。
那么我们现在可能有一个下面的需要:
  假设现在有一个course课程model,里面维持了一个数,记录课程收藏数,还存在一个用户收藏userfav的model(应当有一个外键指向course),当一个用户对课程进行收藏,理论上现在post进来的应该是userfav的instance,显然,我们还需要对相应course的收藏数进行+1。
这个时候,我们就需要重写perform_create( )方法!

def perform_create(self, serializer):
# 重写save的逻辑instance = serializer.save()course = instance.coursecourse.fav_num += 1course.save()

  显然,这不是唯一的解决方法,我们还可以在seriliazer进行设置,我们还可以使用drf的信号量进行解决!

2. ListModelMixin

# 源码
class ListModelMixin(object):"""List a queryset.==> 列表页获取"""def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())# 这是一个分页功能,如果在viewset中设置了pagination_class,那么这里就会起作用# 获取当前页的queryset,如果不存在分页,返回Nonepage = self.paginate_queryset(queryset)if page is not None:# 分页不为空,那么不能简单的执行Response(serializer.data)# 还需要将相关的page信息序列化在进行响应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)

 ListModelMixin一般用来获取列表页,大多数情况下比较简单,不需要重写相关的方法。

3. RetrieveModelMixin

# 源码
class RetrieveModelMixin(object):"""Retrieve a model instance.==> 获取某一个对象的具体信息"""def retrieve(self, request, *args, **kwargs):# 一般访问的url都为/obj/id/这种新式# get_object()可以获取到这个id的对象# 注意在viewset中设置lookup_field获取重写get_object()方法可以指定id具体对象是什么~!instance = self.get_object()serializer = self.get_serializer(instance)return Response(serializer.data)

对retrieve这个方法的重写几率比较高,例如我们在增加点击数的时候,经常要对其进行一个重写。

4. RetrieveModelMixin

# 源码
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'] = Truereturn self.update(request, *args, **kwargs)

RetrieveModelMixin的实现逻辑基本整合了Create以及Retrieve,先得到具体的实例,再对其进行验证以及保存,如果需要对更新这个逻辑进行自定义,那么需要重写perform_update( )方法,而尽量少去重写update( )

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

DestroyModelMixin的逻辑也相对比较简单,我们取CreateModelMixin下面的例子,当我们取消收藏,那么我们的DestroyModelMixin就发挥作用了。同理

def perform_create(self, serializer):instance = serializer.save()course = instance.courseif course.fav_num > 0:course.fav_num -= 1else:course.fav_num = 0course.save()

小结

  mixins相对比较好理解,本篇只是简要的分析了源码的内容以及各个mixins的逻辑,最重要的还是学会去重写它们相关的方法。
一般情况下,当我们在操作某一个model的时候,涉及到另外一个model中数据的修改,那么就需要对这个mixins下执行save的逻辑的方法进行重写。

转载于:https://www.cnblogs.com/guigujun/p/9926454.html

django rest framework mixins小结相关推荐

  1. Django REST framework的一些奇巧淫技(干货!!!)

    开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...

  2. Django REST framework 1

    Django REST framework Django REST framework官方文档:点击  中文文档:点击 安装djangorestframework:pip3 install djang ...

  3. Django Rest Framework

    新的一年启程,大家又投入到紧张的学习和工作中,作为一个互联网人必须时刻紧跟科技发展的脚步.对于大火的 Python 编程语言我们怎么能错过,我们[51Reboot]这就为大家带来新年的第一堂 Pyth ...

  4. django restful 请求_利用 Django REST framework 构建 RESTful Web API

    利用 Django REST framework 构建 RESTful Web API 终于到了动手操作的环节啦,这一节,我们以师生管理系统为例,带领大家搭建一套 framework Web API. ...

  5. 10- vue django restful framework 打造生鲜超市 -用户登录和手机注册(中)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 手机注册和用户登录(中) Json Web Token的原理 因为我们的drf 的 ...

  6. Django REST Framework API Guide 02

    本节大纲 1.Generic Views 2.ViewSets  1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...

  7. [转]Django REST framework 简介与中文教程

    Django REST framework 简介与中文教程 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 在开发REST AP ...

  8. Django Rest framework (看完直接上手用)

    Restframework DjangoRestframework 主要使用 APIView 类,其 APIView 实质是对 View 进行继承加工了更多功能 请求进来 APIView() 首先执行 ...

  9. Django REST Framework教程(4): 玩转序列化器(Serializer)

    在前面的文章中我们以博客为例,自定义了一个简单的 ArticleSerializer 类, 并分别以函数视图(FBV)和基于类的视图(CBV)编写了博客文章列表资源和单篇文章资源的API,支持客户端以 ...

最新文章

  1. 汽车中的ECU, VCU, MCU, HCU
  2. Fast Flux技术——本质就是跳板,控制多个机器,同一域名指向极多的IP(TTL修改为0),以逃避追踪...
  3. C# string.Format谨慎使用
  4. 《MySQL—— 业务高峰期的性能问题的紧急处理的手段 》
  5. 灰色关联法 —— matlab
  6. mysql 层_mysql各个层面优化
  7. 【流媒體】live555—VS2010 下live555编译、使用及测试
  8. 《运维工程师成长之路》一2.2 小结
  9. (7)公众号开发-自定义菜单
  10. shfileoperation C#无法读源文件或磁盘XP系统1026错误
  11. 清华本科生0人去阿里,交叉信息院硕士没人再深造 | 清华大学2020年毕业生就业质量报告...
  12. Jmeter 阶梯线程组
  13. 【微信小程序】各种页面特殊效果合集第二期
  14. wx2540h配置教程_H3C wx3000系列配置
  15. 数据仓库-Hive(一)
  16. Arduino的详细介绍(基于Mega2560)
  17. matlab中绘制图像
  18. iOS开发之数据存取
  19. 区块链随想录——BitCoin的未来会如何?
  20. Win10远程桌面连接不上Win7的桌面的一次奇葩经历

热门文章

  1. 外汇呼叫中心如何在严格监管中存续
  2. Android中Handler的使用
  3. GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
  4. 学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS
  5. 【原创翻译】The Case for the Reduced Instruction Set Computer
  6. 生成从A到Z这个一个字符序列
  7. 管道过滤器模式(Pipe and Filter)与组合模式(修改)
  8. Strategy模式与Delegate委托
  9. [转] spdk 块设备
  10. 一个浙江人的23条经典经商法则