django views_django admin视图

django views_django admin视图前言ViewSet只是一种基于类的视图,它不提供任何方法处理程序(如.get()或.post()),而是提供诸如.list()和.create()之类的操作。ViewSet的方法处理程序

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

ViewSet 只是一种基于类的视图,它不提供任何方法处理程序(如 .get().post()),而是提供诸如.list().create() 之类的操作。
ViewSet 的方法处理程序仅使用 .as_view() 方法绑定到完成视图的相应操作。
通常不是在urlconf中的视图集中显示注册视图,而是要使用路由类注册视图集,该类会自动为你确定 urlconf
 

源码分析

我们首先看一下viewsets.py文件的源码结构,如下图
django views_django admin视图
我们可以看到有5个类

  • ViewSetMixin
  • ViewSet:继承自ViewSetMixinAPIView
  • GenericViewSet:继承自ViewSetMixinGenericAPIView
  • ReadOnlyModelViewSet:继承自RetrieveModelMixinListModelMixinGenericViewSet
  • ModelViewSet:继承自5大mixins工具类和GenericViewSet
     

ViewSetMixin

通过上述代码结构分析,我们了解到只要知道ViewSetMixin是干嘛的,其他的类都继承于它。从源码中我们知道,ViewSetMixin重写了as_view()方法,源码如下:

def as_view(cls, actions=None, **initkwargs):
    """
    由于基于类的视图围绕实例化视图创建闭包的方式,我们需要完全重新实现`.as_view`,并稍微修改创建和返回的视图函数。 
    对于某些路由配置,initkwargs 的名称和描述可能会被明确覆盖,例如,额外操作的名称。
    """
    # 名称和描述 initkwargs 可能会被显式覆盖
    cls.name = None
    cls.description = None
    
    # 后缀 initkwarg 保留用于显示视图集类型。如果提供了名称,则此 initkwarg 应该无效。
    cls.suffix = None

    cls.detail = None
    
    # 设置 basename 允许视图反转其操作 url。该值由路由器通过 initkwargs 提供。
    cls.basename = None
    
    # actions必须不能为空,否则报错
    if not actions:
        raise TypeError("The `actions` argument must be provided when "
                        "calling `.as_view()` on a ViewSet. For example "
                        "`.as_view({'get': 'list'})`")

    # 清理关键字参数
    for key in initkwargs:
        if key in cls.http_method_names:
            raise TypeError("You tried to pass in the %s method name as a "
                            "keyword argument to %s(). Don't do that."
                            % (key, cls.__name__))
        if not hasattr(cls, key):
            raise TypeError("%s() received an invalid keyword %r" % (
                cls.__name__, key))
    
    # name和suffix是互斥的
    if 'name' in initkwargs and 'suffix' in initkwargs:
        raise TypeError("%s() received both `name` and `suffix`, which are "
                        "mutually exclusive arguments." % (cls.__name__))
    
    def view(request, *args, **kwargs):
        self = cls(**initkwargs)

        if 'get' in actions and 'head' not in actions:
            actions['head'] = actions['get']

        self.action_map = actions
        
        # 将方法绑定到actions, 这是与标准视图不同的一点
        for method, action in actions.items():
            handler = getattr(self, action)
            setattr(self, method, handler)

        self.request = request
        self.args = args
        self.kwargs = kwargs

        return self.dispatch(request, *args, **kwargs)

    update_wrapper(view, cls, updated=())

    update_wrapper(view, cls.dispatch, assigned=())

    view.cls = cls
    view.initkwargs = initkwargs
    view.actions = actions
    return csrf_exempt(view)

从上述源码中了解到,ViewSetMixin重写了as_view方法,as_view是将请求的方法绑定到了actions
 

ViewSet

class ViewSet(ViewSetMixin, views.APIView):
    """
    默认情况下,基本 ViewSet 类不提供任何操作。
    """
    pass

ViewSet继承了ViewSetMixinAPIView,增删改查需要我们自己定义
 

GenericViewSet

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
    """
    GenericViewSet 类默认不提供任何操作,但包含通用视图行为的基本集,例如`get_object` 和`get_queryset` 方法。
    """
    pass

GenericViewSet类相比ViewSet,包含了一些视图行为的通用方法
 

视图集特点

  1. 视图集都是优先继承ViewSetMixin类,再继承一个视图类(GenericAPIView或APIView)
  2. ViewSetMixin提供了重写的as_view()方法,继承视图集的视图类,配置路由时调用as_view()必须传入 请求-函数名 映射关系字典
    eg: path('v1/books/<int:pk>/', views.BookGenericViewSet.as_view({"get": "my_get_obj"}))
     

GenericAPIView与APIView 作为两大继承视图的区别

  1. GenericViewSetViewSet都继承了ViewSetMixinas_view都可以配置 请求-函数 映射
  2. GenericViewSet继承的是GenericAPIView视图类,用来完成标准的model类操作接口
  3. ViewSet继承的是APIView视图类,用来完成不需要model类参与,或是非标准的model类操作接口
    post请求在标准的model类操作下就是新增接口,登陆的post不满足
    post请求验证码接口,不需要model类的参与
    案例:登陆的post请求,并不是完成数据的新增,只是用post提交数据,得到的结果也不是登陆的用户信息,而是登陆的认证信息
     

ReadOnlyModelViewSet

class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet):
    """
    提供默认`list()` 和`retrieve()` 操作的视图集。
    """
    pass

 

ModelViewSet

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    一个提供默认 `create()`、`retrieve()`、`update()`、`partial_update()`、`destroy()` 和 `list()` 操作的视图集。
    """
    pass

 

实战案例

视图函数如下

class StudentViewSets(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    def my_get(self, request, *args, **kwargs):
        response =  self.retrieve(request, *args, **kwargs)
        return APIResponse(results=response.data)

    def my_list(self, request, *args, **kwargs):
        response = self.list(request, *args, **kwargs)
        return APIResponse(results=response.data)

我们继承自ModelViewSet,自带5个mixins工具,我们定义了2个查询方法,然后在urls中配置

urlpatterns = [
    path('v2/student/<int:pk>/', views.StudentViewSets.as_view({"get": "my_get"})),
    path('v2/student/', views.StudentViewSets.as_view({"get": "my_list"})),
]

as_view中添加了get请求方式的方法,有pk调用my_get代表单查,没有pk调用my_list代表群查,这样写的原因就是我们的StudentViewSets继承了ViewSetMixin

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165765.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Springboot文件上传机制[通俗易懂]

    Springboot文件上传机制[通俗易懂]springboot文件上传机制:1.访问路径2. 上传完成后返回访问文件地址3. 我们只需要访问返回的地址就可以访问到图片4. yaml配置文件(localpath是实际存储的地址)5. 添加配置类,进行访问地址和存储地址映射 @Value(“${file.upload.suffixPath}”) private String uploadSuffixPath; @Value(“${file.upload.localPath}”) private Strin

    2022年8月9日
    5
  • java清除session_退出页面自动清除java session方法

    java清除session_退出页面自动清除java session方法在关闭页面时自动清除Sessioncookie,页面缓存。在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息。清除session对象内容的主要方法如下:(1)、removeAttribute()方法。该方法是用来删除session对象中保存的指定属性信息。例如:sessi…

    2022年7月12日
    16
  • Python安装pymssql「建议收藏」

    Python安装pymssql「建议收藏」Python安装pymssql(v2.1.3)pymssql下载地址:https://pypi.python.org/pypi/pymssql/python2.7×32版本下pymssql的安装:如果使用2.1.1版本:https://pypi.python.org/pypi/pymssql/2.1.1#downloads,下载时选择pymssql-2.1.1.win32-py2.7.exe

    2022年6月15日
    148
  • zencart模板修改定制笔记9:如何修改定制某个边框标题[通俗易懂]

    zencart模板修改定制笔记9:如何修改定制某个边框标题[通俗易懂]zencart模板修改定制笔记9:如何修改定制某个边框标题.pdf下载地址:http://vdisk.weibo.com/s/31MWe/1331169427下一篇:zencart模板修改定制笔记10:?.pdf

    2022年7月27日
    4
  • html协议属于哪层,smtp协议在什么层

    SMTP:简单邮件传输协议SMTP:SimpleMailTransferProtocol)SMTP是一种提供可靠且有效电子邮件传输的协议。SMTP是建模在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。SMTP协议简介1.介绍SMTP称为简单Mail传输协议(SimpleMailTransferProtocal),目标是向用户…

    2022年4月16日
    43
  • idea汉化之后打不开settings解决方法

    idea汉化之后打不开settings解决方法用解压软件打开汉化包,进入messages目录,找到settings的配置文件:VcsBundle.properties以及定位的配置文件:UIBundle.properties将这两个文件删掉重新启动IDEA即可完美解决,感谢这位前辈。…

    2022年5月30日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号