官网:https://www.django-rest-framework.org/api-guide/viewsets/

在django rest framework 视图中一共有N个类

第一类:APIview

  1. class IndexView(APIView):
  2. def get(self,request,*args,**kwargs):
  3. pk = kwargs.get('pk')
  4. if pk:
  5. queryset = models.UserInfo.objects.get(pk=pk)
  6. ser = UserInfoSerializer(instance=queryset,many=False)
  7. else:
  8. queryset = models.UserInfo.objects.all()
  9. ser = UserInfoSerializer(instance=queryset,many=True)
  10. return Response(ser.data)
  11. #

这种直接继承了APIView,是最原始的。请求方式就是那五种,get,post,put,patch,delete

第二类 GenericAPIView

  1. class IndexView(GenericAPIView):
  2. queryset = models.UserInfo.objects.all()
  3. serializer_class = UserInfoSerializer
  4. lookup_field = 'pk'
  5. def get(self,request,*args,**kwargs):
  6. pk = kwargs.get('pk')
  7. if pk:
  8. users = self.filter_queryset(queryset=models.UserInfo.objects.get(pk=pk))
  9. ser = self.get_serializer(instance=users)
  10. else:
  11. users = self.get_queryset()
  12. ser = self.get_serializer(instance=users,many=True)
  13. return Response(ser.data)

在GenericAPIView中要重写一些字段和方法,不常用。

第三类 GenericViewSet

  1. class IndexView(GenericViewSet):
  2. serializer_class = UserInfoSerializer
  3. queryset = models.UserInfo.objects.all()
  4. def create(self,request,*args,**kwargs):
  5. pass
  6. def list(self,request,*args,**kwargs): # 获取列表数据
  7. users = models.UserInfo.objects.all()
  8. ser = UserInfoSerializer(instance=users,many=True)
  9. return Response(ser.data)
  10. def retrieve(self,request,*args,**kwargs): # 获取单条数据
  11. pk = kwargs.get('pk')
  12. users = models.UserInfo.objects.get(pk=pk)
  13. ser = UserInfoSerializer(instance=users,many=False)
  14. return Response(ser.data)
  15. def destroy(self,request,*args,**kwargs):
  16. pass
  17. def update(self,request,*args,**kwargs):
  18. pass
  19. def partial_update(self,request,*args,**kwargs):
  20. pass

这个类继承了ViewSetMixin, generics.GenericAPIView,其中在ViewSetMixin中会重写as_view()方法,因此可以将URL中的请求方式与视图函数绑定到一起,在urls.py中以键值对的方式存在:
urls.py

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4. urlpatterns = [
  5. # url(r'^admin/', admin.site.urls),
  6. url(r'^hehe/', views.hehe),
  7. url(r'^index/$', views.IndexView.as_view({'get':'list','post':'create'})),
  8. url(r'^index/(?P<pk>\d+)/$', views.IndexView.as_view({'get':'retrieve','put':'update','patch':'partial_update','delete':'destroy'})),
  9. ]

ViewSetMixin源码部分:

  1. class ViewSetMixin(object):
  2. """
  3. This is the magic.
  4. Overrides `.as_view()` so that it takes an `actions` keyword that performs
  5. the binding of HTTP methods to actions on the Resource.
  6. For example, to create a concrete view binding the 'GET' and 'POST' methods
  7. to the 'list' and 'create' actions...
  8. view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
  9. """
  10. @classonlymethod
  11. def as_view(cls, actions=None, **initkwargs):
  12. """
  13. Because of the way class based views create a closure around the
  14. instantiated view, we need to totally reimplement `.as_view`,
  15. and slightly modify the view function that is created and returned.
  16. """
  17. # The suffix initkwarg is reserved for displaying the viewset type.
  18. # eg. 'List' or 'Instance'.
  19. cls.suffix = None
  20. # Setting a basename allows a view to reverse its action urls. This
  21. # value is provided by the router through the initkwargs.
  22. cls.basename = None
  23. # actions must not be empty
  24. if not actions:
  25. raise TypeError("The `actions` argument must be provided when "
  26. "calling `.as_view()` on a ViewSet. For example "
  27. "`.as_view({'get': 'list'})`")
  28. # sanitize keyword arguments
  29. for key in initkwargs:
  30. if key in cls.http_method_names:
  31. raise TypeError("You tried to pass in the %s method name as a "
  32. "keyword argument to %s(). Don't do that."
  33. % (key, cls.__name__))
  34. if not hasattr(cls, key):
  35. raise TypeError("%s() received an invalid keyword %r" % (
  36. cls.__name__, key))
  37. def view(request, *args, **kwargs):
  38. self = cls(**initkwargs)
  39. # We also store the mapping of request methods to actions,
  40. # so that we can later set the action attribute.
  41. # eg. `self.action = 'list'` on an incoming GET request.
  42. self.action_map = actions
  43. # Bind methods to actions
  44. # This is the bit that's different to a standard view
  45. for method, action in actions.items():
  46. handler = getattr(self, action) # 通过反射获取请求方式
  47. setattr(self, method, handler) # 绑定到视图函数中的方法
  48. if hasattr(self, 'get') and not hasattr(self, 'head'):
  49. self.head = self.get
  50. self.request = request
  51. self.args = args
  52. self.kwargs = kwargs
  53. # And continue as usual
  54. return self.dispatch(request, *args, **kwargs)
  55. # take name and docstring from class
  56. update_wrapper(view, cls, updated=())
  57. # and possible attributes set by decorators
  58. # like csrf_exempt from dispatch
  59. update_wrapper(view, cls.dispatch, assigned=())
  60. # We need to set these on the view function, so that breadcrumb
  61. # generation can pick out these bits of information from a
  62. # resolved URL.
  63. view.cls = cls
  64. view.initkwargs = initkwargs
  65. view.suffix = initkwargs.get('suffix', None)
  66. view.actions = actions
  67. return csrf_exempt(view)
  68. def initialize_request(self, request, *args, **kwargs):
  69. """
  70. Set the `.action` attribute on the view,
  71. depending on the request method.
  72. """
  73. request = super(ViewSetMixin, self).initialize_request(request, *args, **kwargs)
  74. method = request.method.lower()
  75. if method == 'options':
  76. # This is a special case as we always provide handling for the
  77. # options method in the base `View` class.
  78. # Unlike the other explicitly defined actions, 'metadata' is implicit.
  79. self.action = 'metadata'
  80. else:
  81. self.action = self.action_map.get(method)
  82. return request
  83. def reverse_action(self, url_name, *args, **kwargs):
  84. """
  85. Reverse the action for the given `url_name`.
  86. """
  87. url_name = '%s-%s' % (self.basename, url_name)
  88. kwargs.setdefault('request', self.request)
  89. return reverse(url_name, *args, **kwargs)

第四类 ModelViewSet 继承了这个类,ModelViewSet继承了四个混入类和一个泛类,

将会获得增删改查的所有方法。

  1. class IndexView(ModelViewSet):
  2. queryset = models.UserInfo.objects.all()
  3. serializer_class = UserInfoSerializer

  1. class ModelViewSet(mixins.CreateModelMixin,
  2. mixins.RetrieveModelMixin,
  3. mixins.UpdateModelMixin,
  4. mixins.DestroyModelMixin,
  5. mixins.ListModelMixin,
  6. GenericViewSet):
  7. """
  8. A viewset that provides default `create()`, `retrieve()`, `update()`,
  9. `partial_update()`, `destroy()` and `list()` actions.
  10. """
  11. pass

使用类视图的好处:
1、我们将各个HTTP请求方法之间,做了更好的分离。
2、可以很容易地,组成可重复使用的行为。

Django rest framework (视图类详解)的更多相关文章

  1. Cocoa编程中视图控制器与视图类详解

    iPhone编程规则是:一个窗口,多个视图.UIView是iPhone屏幕上很多控件的基础类.每个iPhone用户界面都是由显示在UIWindow(这其实也是个特殊的UIView)内的众多UIView ...

  2. Django Rest Framework(2)-----序列化详解(serializers)

    REST framework中的序列化类与Django的Form和ModelForm类非常相似.我们提供了一个Serializer类,它提供了一种强大的通用方法来控制响应的输出,以及一个ModelSe ...

  3. [Django REST framework - 视图组件之视图基类、视图扩展类、视图子类、视图集]

    [Django REST framework - 视图组件之视图基类.视图扩展类.视图子类.视图集] 视图继承关系 详图见文章末尾 视图组件可点我查看 两个视图基类:APIView.GenericAP ...

  4. Django之form表单详解

    构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...

  5. QAction类详解:

    先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action tha ...

  6. ThinkPHP视图查询详解

    ThinkPHP视图查询详解 参考http://www.jb51.net/article/51674.htm   这篇文章主要介绍了ThinkPHP视图查询,需要的朋友可以参考下     ThinkP ...

  7. Django Rest Framework 视图和路由

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

  8. python 全栈开发,Day96(Django REST framework 视图,django logging配置,django-debug-toolbar使用指南)

    昨日内容回顾 1. Serializer(序列化) 1. ORM对应的query_set和ORM对象转换成JSON格式的数据 1. 在序列化类中定义自定义的字段:SerializerMethodFie ...

  9. Django REST framework - 视图

    目录 Django REST framework 视图GenericAPIView GenericAPIView 例子 属性 混入 具体视图类 自定义基类 Django REST framework ...

随机推荐

  1. jQuery实现全选与全部选

    为了便于用户理解,直接粘贴下面的代码即可 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  2. Vue Router高级

    路由组件传参 通过props解耦 const User = { props: ['id'], template: '<div>User {{ id }}</div>' } co ...

  3. [转]Delphi DLL的创建、静态 以及动态调用

    第一章  DLL简单介绍 由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结. 首先装简单介绍下DLL: 1,减小可执行文件的大小 DLL技术的产生有很大一部分原因是为了减小可执行 ...

  4. 限时免费 GoodSync 10 同步工具【转】

    一款不错的软件,正在开发本身的云盘,要是能够云执行任务就更好了! GoodSync 10是一种简单和可靠的文件备份和文件同步软件.它会自动分析.同步,并备份您的电子邮件.珍贵的家庭照片.联系人,.MP ...

  5. HDU3605: Escape-二进制优化建图-最大流

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  \(n(n\leq 100000)\)个人\(m(m\leq 10) ...

  6. 开发中运行mysql脚本,发现提示mysql提示Column count doesn't match value count at row 1错误

    开发中运行mysql脚本,发现提示mysql提示Column count doesn't match value count at row 1错误, 调试后发现是由于写的SQL语句里列的数目和后面的值 ...

  7. IAsyncResult

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. AtCoder ABC 128F Frog Jump

    题目链接:https://atcoder.jp/contests/abc128/tasks/abc128_f 题目大意 给定长度为 N 的序列$s_0, s_1, \dots, s_{N-1}$,现在 ...

  9. docker 使用网络以及容器互联

    [root@docker01 /]# docker run -d -p : --name web training/webapp ####小p ,容器的5000端口随机映射到宿主机的9999端口 se ...

  10. Linux下core文件调试

    1,ulimit -a查看默认参数 2,ulimit -c 1024 设置core文件大小,如果超过1024个blocks,则不会产生core文件 注:tune2fs -l /dev/sda8 输出分 ...