请结合【DRF序列化】此文献中的数据文件及序列化文件来阅读如下代码.

DRF视图为我们提供了非常简便的方法——内置了增删改查等一系列的操作.

我们只需在url中指定对应的方法,视图继承内置方法的类,即可实现两三行代码搞定一个请求.

@


我们先看看仿照内置方法实现的

APIView视图文件:

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.viewsets import ViewSetMixin
  4. """ ===================== 一层封装 ===================== """
  5. class GenericAPIView(APIView):
  6. queryset = None
  7. serializer_class = None
  8. def get_queryset(self):
  9. """用于获取queryset的方法"""
  10. return self.queryset.all()
  11. def get_serializer(self, *args, **kwargs):
  12. """用于调用序列化类的方法"""
  13. return self.serializer_class(*args, **kwargs)
  14. class ListModelMixin():
  15. """用于返回get请求所有数据的数据"""
  16. def list(self, request):
  17. queryset = self.get_queryset() # self调用的方法(get_queryset)是从执行此方法(list)的当前对象的类中开始找
  18. ser_obj = self.get_serializer(queryset, many=True) # 原理同上句话
  19. return Response(ser_obj.data)
  20. class CreateModelMixin():
  21. """用于处理post请求发来的数据"""
  22. def create(self, request):
  23. ser_obj = self.get_serializer(data=request.data)
  24. if ser_obj.is_valid():
  25. ser_obj.save()
  26. return Response(ser_obj.validated_data)
  27. return Response(ser_obj.errors)
  28. class RetrieveModelMixin():
  29. """用于返回get请求查询单条数据方法"""
  30. def retrieve(self, request, id):
  31. book_obj = self.get_queryset().filter(id=id).first()
  32. ser_obj = self.get_serializer(book_obj)
  33. return Response(ser_obj.data)
  34. class UpdateModelMixin():
  35. """用于处理put请求发来的数据(更新数据)"""
  36. def update(self, request, id):
  37. book_obj = self.get_queryset().filter(id=id).first()
  38. ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
  39. if ser_obj.is_valid():
  40. ser_obj.save()
  41. return Response(ser_obj.validated_data)
  42. return Response(ser_obj.errors)
  43. class DestroyModelMixin():
  44. """用于删除单条数据"""
  45. def destroy(self, request, id):
  46. book_obj = self.get_queryset().filter(id=id).first()
  47. if book_obj:
  48. book_obj.delete()
  49. return Response('')
  50. return Response('The deleted object does not exist.')
  51. """ ===================== 二层封装 ===================== """
  52. class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
  53. pass
  54. class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
  55. pass

视图文件:

  1. from .custom_mixin import ListCreateAPIView, RetrieveUpdateDestroyAPIView # 导入上述的APIView视图文件
  2. from DRFView import models
  3. from .serializers import BookSerializer # 导入自定义的序列化文件
  4. class Book(ListCreateAPIView):
  5. queryset = models.Book.objects.all() # 坑:这里的queryset只是放到缓存里了,再次取时还需要用.all()方法
  6. serializer_class = BookSerializer
  7. def get(self, request):
  8. return self.list(request)
  9. def post(self, request):
  10. return self.create(request)
  11. class BookEdit(RetrieveUpdateDestroyAPIView):
  12. queryset = models.Book.objects.all()
  13. serializer_class = BookSerializer
  14. def get(self, request, id):
  15. return self.retrieve(request, id)
  16. def put(self, request, id):
  17. return self.update(request, id)
  18. def delete(self, request, id):
  19. return self.destroy(request, id)

改进版

urls.py文件:

  1. urlpatterns = [
  2. url(r'^book/$', BookModel.as_view({'get': 'list', 'post': 'create'})),
  3. url(r'^book/(?P<id>\d+)/$', BookModelView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
  4. ]
  5. """
  6. 注意as_view的传参:
  7. as_view({"请求方式": "调用的方法"}, {...})
  8. 指定请求方式调用的方法后,框架会为我们自动执行其方法,无需在CBV中写请求的方法了.
  9. """

APIView视图文件:

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.viewsets import ViewSetMixin # 导入DRF封装好的APIView
  4. """ ===================== 第一层封装 ===================== """
  5. class GenericAPIView(APIView):
  6. queryset = None
  7. serializer_class = None
  8. def get_queryset(self):
  9. """用于获取queryset的方法"""
  10. return self.queryset.all()
  11. def get_serializer(self, *args, **kwargs):
  12. """用于调用序列化类的方法"""
  13. return self.serializer_class(*args, **kwargs)
  14. class ListModelMixin():
  15. """用于返回get请求所有数据的数据"""
  16. def list(self, request):
  17. queryset = self.get_queryset() # self调用的方法(get_queryset)是从执行此方法(list)的当前对象的类中开始找
  18. ser_obj = self.get_serializer(queryset, many=True) # 原理同上句话
  19. return Response(ser_obj.data)
  20. class CreateModelMixin():
  21. """用于处理post请求发来的数据"""
  22. def create(self, request):
  23. ser_obj = self.get_serializer(data=request.data)
  24. if ser_obj.is_valid():
  25. ser_obj.save()
  26. return Response(ser_obj.validated_data)
  27. return Response(ser_obj.errors)
  28. class RetrieveModelMixin():
  29. """用于返回get请求查询单条数据方法"""
  30. def retrieve(self, request, id):
  31. book_obj = self.get_queryset().filter(id=id).first()
  32. ser_obj = self.get_serializer(book_obj)
  33. return Response(ser_obj.data)
  34. class UpdateModelMixin():
  35. """用于处理put请求发来的数据(更新数据)"""
  36. def update(self, request, id):
  37. book_obj = self.get_queryset().filter(id=id).first()
  38. ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
  39. if ser_obj.is_valid():
  40. ser_obj.save()
  41. return Response(ser_obj.validated_data)
  42. return Response(ser_obj.errors)
  43. class DestroyModelMixin():
  44. """用于删除单条数据"""
  45. def destroy(self, request, id):
  46. book_obj = self.get_queryset().filter(id=id).first()
  47. if book_obj:
  48. book_obj.delete()
  49. return Response('')
  50. return Response('The deleted object does not exist.')
  51. """ ===================== 第二层封装 ===================== """
  52. class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
  53. pass
  54. class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
  55. pass
  56. """ ===================== 第三层封装 ===================== """
  57. class ModelViewSet(ViewSetMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
  58. # ViewSetMixin重写了as_view方法,即可以传参了.
  59. pass

视图文件:

  1. from .custom_mixin import ModelViewSet # 导入上述的APIView视图文件
  2. from DRFView import models
  3. from .serializers import BookSerializer # 导入自定义的序列化文件
  4. class BookModel(ModelViewSet):
  5. queryset = models.Book.objects.all()
  6. # 坑:这里的queryset只是放到缓存里了,再次取时还需要用.all()方法
  7. # queryset是框架能识别的,会把数据放到缓存中,如果该成其它的名字则不会缓存(比如query),即再此取数据时不能加.all()
  8. serializer_class = BookSerializer
  9. class BookModelView(ModelViewSet):
  10. queryset = models.Book.objects.all()
  11. serializer_class = BookSerializer

接下来,我们再来看看DRF为我们封装好了的APIView用法。


开始使用内置视图

第一步 按照框架的要求写url

  1. urlpatterns = [
  2. url(r'^book/$', BookModel.as_view({'get': 'list', 'post': 'create'})),
  3. # 按照APIView的要求,这里必须写为pk,而不能写id
  4. url(r'^book/(?P<pk>\d+)/$', BookModelView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
  5. ]
  6. """
  7. 注意as_view的传参:
  8. as_view({"请求方式": "调用的方法"}, {...})
  9. 指定请求方式调用的方法后,无需在CBV中写请求的方法了.
  10. """

第二步 写视图文件

  1. from DRFView import models
  2. from .serializers import BookSerializer # 导入自定义的序列化文件
  3. from rest_framework.viewsets import ModelViewSet # 导入DRF封装好的APIView
  4. class BookModel(ModelViewSet):
  5. queryset = models.Book.objects.all()
  6. serializer_class = BookSerializer
  7. class BookModelView(ModelViewSet):
  8. queryset = models.Book.objects.all()
  9. serializer_class = BookSerializer

如上步骤,我们的视图只要写两行就可以了.

关于DRF视图源码解析,推荐参考此文献:https://www.cnblogs.com/GGGG-XXXX/articles/9675911.html

继承顺序图解:



【DRF视图】的更多相关文章

  1. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  2. DRF视图-请求与响应

    DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...

  3. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  4. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

  5. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  6. restfull规范、DRF视图和路由

    一.restfull规范的简单介绍 1.介绍 REST:表述性状态转移,是一种web交互方案 资源:在web中只要有被引用的必要都是资源 URI: URI 统一资源标识符 URL 统一资源定位符 统一 ...

  7. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  8. DRF 视图和路由

    Django Rest Feamework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个 ...

  9. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

随机推荐

  1. 20180929 北京大学 人工智能实践:Tensorflow笔记02

    https://www.bilibili.com/video/av22530538/?p=16 https://www.bilibili.com/video/av22530538/?p=14 (完)

  2. Python组织文件 实践:将文件的不同版本备份为ZIP文件

    功能:备份文件夹.能将文件的不同版本备份下来,并且每个有不同的名字 #! python3 # backupToZip.py - 备份文件的不同版本到压缩文件中 import zipfile,os #f ...

  3. 紫书 例题 10-26 UVa 11440(欧拉函数+数论)

    这里用到了一些数论知识 首先素因子都大于M等价与M! 互质 然后又因为当k与M!互质且k>M!时当且仅当k mod M! 与M!互质(欧几里得算法的原理) 又因为N>=M, 所以N!为M! ...

  4. Select For update语句浅析

    Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...

  5. iOS打造属于自己的用户行为统计系统

      打造一款符合自己公司需求的用户行为统计系统,相信是非常多运营人员的梦想,也是开发人员对技术的的执着追求. 以下我为大家分一享下自己为公司打造的用户行为统计系统.   用户行为统计(User Beh ...

  6. 软件project总结

    软件project的文档完结了.在这里面学到了好多东西.也通过它分析了对机房收费系统进行了更加具体的分析.尽管早就明确了之间的联系,可是越温习越体会到逻辑的重要性和全心全意为人民服务的精神. 这些文档 ...

  7. 控制器不存在:app\admin\controller\Document

    控制器不存在:app\admin\controller\Document 报错: 控制器不存在:app\admin\controller\Document 但是我在代码里面找了半天没出现Documen ...

  8. zzuli--1812--sort(模拟水题)

    1812: sort Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 158  Solved: 30 SubmitStatusWeb Board Des ...

  9. OpenGL编程逐步深入(一)创建一个窗口

    原文地址:http://ogldev.atspace.co.uk/ 原文中使用gnu make进行项目管理,本系列文章使用visual studio2012.在翻译过程中并非直译,加入了一些笔者个人观 ...

  10. Android自定义组件系列【14】——Android5.0按钮波纹效果实现

    今天任老师发表了一篇关于Android5.0中按钮按下的波纹效果实现<Android L中水波纹点击效果的实现>,出于好奇我下载了源代码看了一下效果,正好手边有一个Nexus手机,我结合实 ...