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)
上一篇 2022年7月31日 下午2:36
下一篇 2022年7月31日 下午2:46


相关推荐

  • 软件工程 — 数据流图的画法

    软件工程 — 数据流图的画法1.数据流图的画法1.1数据流图的概念数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。说明:在数据流图中没有任何具体的物理部件,它只是描绘数据在软件中流动和被处理的逻辑过程。数据流图是系统逻辑功能的图形表示,即使不是专业的计算机技术人员也容易理解它,因此是分析员与用户之间极好的通信工具。此外,设计数据流图时只需考虑系统必须完成的基本逻辑功能,完全不需要考虑怎样具体地实现这些功能,所以它也是今后进行软件设计的很好的出发点。1.2

    2022年6月16日
    45
  • rabbitmq集群搭建_mongodb集群搭建

    rabbitmq集群搭建_mongodb集群搭建docker单容器部署创建桥接网络,用于容器间通信$dockernetworkcreatemq-network首先启动3个rabbitmq容器$dockerrun–namerabbit01\ -eRABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=”-setcookieCOUBJLKLQCIAPKIQZGGJ”\ –hostnamerabbit01–networkmq-network\ -p5672:5672-p1567

    2025年10月24日
    6
  • mysql数据库内NUMERIC系列数据类型介绍

    mysql数据库内NUMERIC系列数据类型介绍tinyint M 很小的整数 占用字节 1 带符号的范围是 128 到 127 无符号的范围是 0 到 255 适用于很小的整数值 宽度 M 4 smallint M 小的整数 占用字节 2 带符号的范围是 32768 到 32767 无符号的范围是 0 到 65535 适用于小的整数 宽度 M 6

    2026年3月17日
    2
  • 计算机网络——子网划分(内含习题讲解)

    计算机网络——子网划分(内含习题讲解)PS:(习题是由b站–计算机网络-谢希仁第7版-河南科技大学视频中获得)前情提要:我们在这之前已经学过了两级的IP地址:但是两级的IP地址有很多弊端,所以我们将要学习三级IP地址,也就是两级IP地址的升级版那我们要注意什么呢?一:我怎么去知道人家用的是两级IP还是三级IP呢?答:利用子网掩码;二:那什么是子网掩码呢?…

    2022年4月19日
    39
  • BurpSuite安装和基础使用教程(已激活成功教程)

    BurpSuite安装和基础使用教程(已激活成功教程)BurpSuite 是用于攻击 web 应用程序的集成平台 它包含了许多 Burp 工具 这些不同的 burp 工具通过协同工作 有效的分享信息 支持以某种工具中的信息为基础供另一种工具使用的方式发起攻击 它主要用来做安全性渗透测试 可以实现拦截请求 BurpSpider 爬虫 漏洞扫描 付费 等类似 Fiddler 和 Postman 但比其更强大的功能 那么我们开始安装教程 BurpSuite 如何安装 BurpSuite 是由 Java 语言编写而成 而 Java 自身的跨平台性 使得软件的学习和使用更加方便

    2026年3月18日
    2
  • native2ascii java_Native2Ascii和Ascii2Native的Java实现

    native2ascii java_Native2Ascii和Ascii2Native的Java实现packageutil;/***native2ascii.exeJavacodeimplementation.**@author*@version1.0*/publicclassNative2AsciiUtils{/***prefixofasciistringofnativecharacter*/privatestaticStringPREFIX=”\…

    2025年8月31日
    5

发表回复

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

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