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/164883.html原文链接:https://javaforall.net

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


相关推荐

  • php 死链查询,seo网站死链解决方法 死链查询检测工具

    php 死链查询,seo网站死链解决方法 死链查询检测工具死链是指服务器的地址已经改变了.无法找到当前地址位置,包括协议死链和内容死链两种形式。死链出现的原因有网站服务器设置错误;某文件夹名称修改,路径错误链接变成死链等。我们都知道死链对seo排名的危害是非常大的。死链对网站的危害一、有可能会让搜索引擎降权二、用户体验较差死链检测方法:Xenu死链查询工具今天教大家如何使用Xenu死链接检测工具对网站死链接(什么是网站死链)进行处理,有图有真相,轻松四步…

    2022年7月23日
    16
  • 盘点多款国产Linux桌面操作系统[通俗易懂]

    盘点多款国产Linux桌面操作系统[通俗易懂]关注、星标公众号,不错过精彩内容编辑:strongerHuang微信公众号:strongerHuang素材来源:百度百科、网络国产操作系统多为以Linux为基础二次开发的操作系统。2014年4月8日起,美国微软公司停止了对WindowsXPSP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。工信部对此表示…

    2022年5月17日
    59
  • WinForm 界面美化

    WinForm 界面美化主界面的扁平化更改winform自带的MainForm窗体属性将主窗体FormBorderStyle更改为None,这样就得到了一个无边框的窗体调节背景色,找到自己喜欢的颜色,输入到BackColor属性中在主窗体的Mouse_Down中添加如下事件,实现窗体随意拖动:[DllImport(“user32.dll”)]publicstaticexternboolReleaseCapture();[DllImport(“user32.dll”)]publicstatic

    2022年5月8日
    57
  • Java项目开发文档(javaweb实战项目)

    项目开发过程中为了增加程序的可读性和程序的健壮性,方便后期程序的调试和维护,所以需要在开发过程中统一技术规范,一般会在项目初期确定好相关文档作为这一统一的规范。不同公司会对文档做不同要求,划不同的分类,但一般来说(或者拿自己的经验说)大致可以分为需求文档、接口文档、流程图(可以单独作为一份文件可以作为附件附在文档中)、变更文件等。一、需求文档在项目启动之后,项目的目标已经明确了,那么就要

    2022年4月15日
    134
  • php开源桌面会议系统,开源视频会议系统 OpenMeetings「建议收藏」

    php开源桌面会议系统,开源视频会议系统 OpenMeetings「建议收藏」OpenMeetings是一个开源的多语言跨平台可定制视频会议和协作系统,基于ApacheLicense2开源协议。它支持音频、视频,支持共享左面,文件协作处理,它还包含一个白板,通过白板可以导入各种格式的图片。它基于OpenLaszlo的新流媒体格式和开源的Flash服务器Red5(基于Java的开源流媒体服务器)。OpenMeetings视频会议具有如下特点:1、基于P2P技术,服务器压…

    2022年7月12日
    28
  • Pycharm如何远程调试服务器(使用Pipenv管理虚拟环境)「建议收藏」

    Pycharm如何远程调试服务器(使用Pipenv管理虚拟环境)「建议收藏」准备工作1.随便准备一个项目工程,在本地用Pipenv创建一个虚拟环境并生成Pipfile和pipfile.lock文件,如下:2.准备一台服务器,我这里使用阿里云的ECSSSH连接上$sshroot@ipPycharm同步项目到服务器Tools→Deployment→Configuration新增一个SFTPConnection页面设…

    2022年8月27日
    7

发表回复

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

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