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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • continue和break的区别 python_c语言continue c.编程.net

    continue和break的区别 python_c语言continue c.编程.net1、continue是跳出本次循环,而不是终止整个循环i=1whilei<9:i=i+1ifi==5:#跳出本次循环,不打印5,整个循环还继续continueprint(i)2、break是终止整个循环i=1whilei<9:i=i+1ifi==5:#跳终止整个循环,后面的不再执行breakprint(.

    2025年11月6日
    4
  • 【技巧总结】位运算装逼指南

    【技巧总结】位运算装逼指南位算法的效率有多快我就不说,不信你可以去用10亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。判断奇偶数判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下…

    2022年6月22日
    35
  • PyCharm使用教程 — 5、PyCharm的基本配置「建议收藏」

    PyCharm使用教程 — 5、PyCharm的基本配置「建议收藏」PyCharm基础配置PyCharm安装完毕之后,我们需要修改一些常用的配置让视觉上更加享受,比如修改PyCharm的主题以及字体显示呢基础配置在File->Settings中进行修改主题在Settings中选择Appearance&Behavior->Appearance,如下图所示我个人习惯使用Darcula的黑色主题,除了默认的主题,我们也可以自己安装其他主题风格。如何安装主题主题可以从网站http://www.themesmap.com/上进行下

    2022年8月29日
    4
  • ThinkPHP实现定时执行任务的两种方法「建议收藏」

    ThinkPHP实现定时执行任务的两种方法「建议收藏」在平常的项目中我们总是会遇到需要将某个方法任务定时执行的问题,定时执行方法任务如果我们拥有服务器的权限,我们可以直接在服务器设置定时任务,例如在Windows的任务计划程序中进行设置,在Linux中编写脚本进行执行。如果我们没有服务器权限,我们该如何使用项目的程序代码来自动定时执行呢?接下来就为大家描述一个基于ThinkPHP框架定时执行任务的例子,具体的方法会在下面进行详细的描述。   

    2022年7月17日
    19
  • ftk学习记录(多形式的文章)

    ftk学习记录(多形式的文章)

    2022年1月11日
    48
  • webservice传递特殊字符时的解决的方法

    webservice传递特殊字符时的解决的方法

    2021年11月29日
    40

发表回复

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

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