视图

5个视图扩展类

视图拓展类的作用:

提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。

这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。

1)ListModelMixin

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

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

源代码:

  1. class ListModelMixin(object):
  2. """
  3. List a queryset.
  4. """
  5. def list(self, request, *args, **kwargs):
  6. # 过滤
  7. queryset = self.filter_queryset(self.get_queryset())
  8. # 分页
  9. page = self.paginate_queryset(queryset)
  10. if page is not None:
  11. serializer = self.get_serializer(page, many=True)
  12. return self.get_paginated_response(serializer.data)
  13. # 序列化
  14. serializer = self.get_serializer(queryset, many=True)
  15. return Response(serializer.data)

举例:

  1. from rest_framework.mixins import ListModelMixin
  2. class BookListView(ListModelMixin, GenericAPIView):
  3. queryset = BookInfo.objects.all()
  4. serializer_class = BookInfoSerializer
  5. def get(self, request):
  6. return self.list(request)

2)CreateModelMixin

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

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

源代码:

  1. class CreateModelMixin(object):
  2. """
  3. Create a model instance.
  4. """
  5. def create(self, request, *args, **kwargs):
  6. # 获取序列化器
  7. serializer = self.get_serializer(data=request.data)
  8. # 验证
  9. serializer.is_valid(raise_exception=True)
  10. # 保存
  11. self.perform_create(serializer)
  12. headers = self.get_success_headers(serializer.data)
  13. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  14. def perform_create(self, serializer):
  15. serializer.save()
  16. def get_success_headers(self, data):
  17. try:
  18. return {'Location': str(data[api_settings.URL_FIELD_NAME])}
  19. except (TypeError, KeyError):
  20. return {}

3)RetrieveModelMixin

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

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

源代码:

  1. class RetrieveModelMixin(object):
  2. """
  3. Retrieve a model instance.
  4. """
  5. def retrieve(self, request, *args, **kwargs):
  6. # 获取对象,会检查对象的权限
  7. instance = self.get_object()
  8. # 序列化
  9. serializer = self.get_serializer(instance)
  10. return Response(serializer.data)

举例:

  1. class BookDetailView(RetrieveModelMixin, GenericAPIView):
  2. queryset = BookInfo.objects.all()
  3. serializer_class = BookInfoSerializer
  4. def get(self, request, pk):
  5. return self.retrieve(request)

4)UpdateModelMixin

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

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

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

源代码:

  1. class UpdateModelMixin(object):
  2. """
  3. Update a model instance.
  4. """
  5. def update(self, request, *args, **kwargs):
  6. partial = kwargs.pop('partial', False)
  7. instance = self.get_object()
  8. serializer = self.get_serializer(instance, data=request.data, partial=partial)
  9. serializer.is_valid(raise_exception=True)
  10. self.perform_update(serializer)
  11. if getattr(instance, '_prefetched_objects_cache', None):
  12. # If 'prefetch_related' has been applied to a queryset, we need to
  13. # forcibly invalidate the prefetch cache on the instance.
  14. instance._prefetched_objects_cache = {}
  15. return Response(serializer.data)
  16. def perform_update(self, serializer):
  17. serializer.save()
  18. def partial_update(self, request, *args, **kwargs):
  19. kwargs['partial'] = True
  20. return self.update(request, *args, **kwargs)

5)DestroyModelMixin

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

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

源代码:

  1. class DestroyModelMixin(object):
  2. """
  3. Destroy a model instance.
  4. """
  5. def destroy(self, request, *args, **kwargs):
  6. instance = self.get_object()
  7. self.perform_destroy(instance)
  8. return Response(status=status.HTTP_204_NO_CONTENT)
  9. def perform_destroy(self, instance):
  10. instance.delete()

使用GenericAPIView和视图扩展类,实现api接口,代码:

  1. """GenericAPIView结合视图扩展类实现api接口"""
  2. from rest_framework.mixins import ListModelMixin,CreateModelMixin
  3. class Students2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin):
  4. # 本次视图类中要操作的数据[必填]
  5. queryset = Student.objects.all()
  6. # 本次视图类中要调用的默认序列化器[玄天]
  7. serializer_class = StudentModelSerializer
  8. def get(self, request):
  9. """获取多个学生信息"""
  10. return self.list(request)
  11. def post(self,request):
  12. """添加学生信息"""
  13. return self.create(request)
  14. from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
  15. class Student2GenericAPIView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
  16. queryset = Student.objects.all()
  17. serializer_class = StudentModelSerializer
  18. # 在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk
  19. def get(self,request,pk):
  20. """获取一条数据"""
  21. return self.retrieve(request,pk)
  22. def put(self,request,pk):
  23. """更新一条数据"""
  24. return self.update(request,pk)
  25. def delete(self,request,pk):
  26. """删除一条数据"""
  27. return self.destroy(request,pk)

GenericAPIView的视图子类

1)CreateAPIView

提供 post 方法

继承自: GenericAPIView、CreateModelMixin

2)ListAPIView

提供 get 方法

继承自:GenericAPIView、ListModelMixin

3)RetrieveAPIView

提供 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

  1. from rest_framework.generics import ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView,RetrieveUpdateDestroyAPIView
  2. class BookGenerView2(ListAPIView,):
  3. serializer_class = BookModelSerializer
  4. queryset = Book.objects.all()
  5. class BookGenerView3(RetrieveAPIView,):
  6. serializer_class = BookModelSerializer
  7. queryset = Book.objects.all()

DRF视图-5个扩展类以及GenericAPIView基类的更多相关文章

  1. 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法

    现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. ...

  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  3. 派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good

    大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...

  4. C++ - 派生类访问模板基类(templatized base class)命名

    派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...

  5. laravel5.8笔记五:基类控制器和基类模型

    建立基类的目的就是为了方便继承.比如:Admin模块访问,是否登陆.检测登陆可以写到基类里面 控制器基类 原始基类:app\Http\Controllers\Controller.php,我们下面要做 ...

  6. C++ - 派生类强制转换为基类

    派生类强制转换为基类 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24268821 在多态的使用时, 派生类的指针或引用能够转换 ...

  7. C#在派生类中调用基类成员

    一.在派生类中调用基类成员 在C#的派生类中,我们可以使用base关键字调用基类中的公有或者受保护成员.这些成员只能是构造函数.实例方法或者实例属性. base关键字调用基类成员的语法格式如下: ba ...

  8. 派生类地址比基类地址少4(CDerived对象的起始地址存放的是虚表指针vptr,也就是子类的第一项内容。接下来的是基类的成员变量,接下来再是自身的成员变量)

    大家对虚表并不陌生,都知道每个含有虚函数的类对象都有1个虚指针,但是在现实使用中,却总是因为这而调试半天,才发现原来是虚指针惹的祸.我这几天在调试代码时候也中招了,我的问题是这样的,如下图,CTree ...

  9. C#派生类中使用基类protected成员的方法

    我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...

随机推荐

  1. C# 内存管理和指针 (13)

    本章要点 运行库在栈和堆上分配空间 垃圾回收 使用析构函数 和 SYstem.IDisposable 接口来释放非托管的资源 C#中使用指针的语法 使用指针实现基于栈的高性能数组 值类型数据 程序第一 ...

  2. [HBase]region compaction流程

  3. CSS效果篇--纯CSS+HTML实现checkbox的思路与实例

    checkbox应该是一个比较常用的html功能了,不过浏览器自带的checkbox往往样式不怎么好看,而且不同浏览器效果也不一样.出于美化和统一视觉效果的需求,checkbox的自定义就被提出来了. ...

  4. 状压dp做题笔记

    CodeChef Factorial to Square (分块决策) Description 给定一个n,要求在[1,n]中删除一些数,并使剩下的数的乘积是一个完全平方数,同时要求乘积最大,求删除方 ...

  5. BZOJ 4260: Codechef REBXOR (trie树维护异或最大值)

    题意 分析 将区间异或和转化为前缀异或和.那么[L,R][L,R][L,R]的异或和就等于presum[R] xor presum[L−1]presum[R]\ xor \ presum[L-1]pr ...

  6. python--openCV--其它

    t1=cv2.getTickCount() # 记录当前时间,以时钟周期计算 t2=cv2.getTickFrequency() #返回时钟周期,返回CPU的频率,返回CPU一秒中所走的时钟周期数

  7. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

  8. C++关键字——register

    register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度.例如下面的内存块拷贝代码, #ifdef NOSTRUCTASSIGN mem ...

  9. vue-quill-editor的用法

    1. main.js引入vue-quill-editor import VueQuillEditor from 'vue-quill-editor' import 'quill/dist/quill. ...

  10. 22.从上往下打印二叉树 Java

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 就是二叉树的层序遍历.借助一个队列就可以实现.使用两个队列一个存放节点,一个存放值.先将根节点加入到队列中,然后遍历队列中的 ...