Django REST Framework(DRF)框架之视图类(视图基类、Mixin扩展类、子类视图)

news2024/11/28 22:01:19

DRF框架之视图类的使用

  • 视图类概述
    • 视图基类
    • Mixin扩展类
    • 子类视图类
  • 视图基类
    • APIView
    • GenericAPIView
  • Mixin扩展类
    • ListModelMixin
    • CreateModelMixin
    • RetrieveModelMixin
    • UpdateModelMixin
    • DestroyModelMixin
  • 子类视图
    • ListAPIView
    • CreateAPIView
    • RetrieveAPIView
    • DestoryAPIView
    • UpdateAPIView
    • ListCreateAPIView
    • RetrieveUpdateAPIView
    • RetrieveDestroyAPIView
    • RetrieveUpdateDestoryAPIView

视图类概述

在Django REST Framework中,视图类是处理请求的核心组件。可以通过多种方式定义视图,包括视图基类、Mixin扩展类和子类视图。

视图基类

使用视图基类时,需要继承一个或多个基类,并实现相应的方法。例如,如果继承了 APIView,需要实现 get()、post()、put()、delete() 等方法。

1. APIView:用于处理任何类型的HTTP请求,并自定义响应行为。
2. GenericAPIView:与 APIView 类似,但具有一些内置的通用方法,例如对象查询和序列化处理。

Mixin扩展类

Mixin是一种用于解决类之间代码重用的设计模式。在 DRF中,Mixin类是用于扩展视图功能的辅助类。

Mixin扩展类通常与视图基类一起使用。例如,编写一个 AuthenticationMixin类来添加身份验证功能,然后将其与 APIView基类一起使用。

1. ListModelMixin:实现获取资源列表的逻辑
2. CreateModelMixin:实现创建数据资源的逻辑
3. RetrieveModelMixin:实现获取单个资源的逻辑
4. UpdateModelMixin:实现更新现有数据资源的逻辑
5. DestoryModelMixin:实现删除数据资源的逻辑

子类视图类

子类视图是DRF 中最高级别的视图类型。它们是基于已经定义的视图和Mixin来创建的,具有更优雅的代码结构。可以通过继承一个或多个Mixin和一个视图基类来创建子类视图。

使用子类视图时,只需要实现所需的方法即可。例如,如果继承了ListAPIView 类,只需要实现 get_queryset() 方法即可。

1. ListAPIView:获取数据列表的视图类
2. CreateAPIView:创建新数据资源的视图类
3. RetrieveAPIView:获取单个资源的视图类
4. UpdateAPIView:更新现有数据资源的视图类
5. DestroyAPIView:删除数据资源的视图类
6. ListCreateAPIView:结合ListAPIView 和 CreateAPIView 的视图类,用于同时获取和创建数据资源。
7. RetreiveUpdateAPIView:结合RetrieveAPIView 和 UpdateAPIView 的视图类,用于同时获取和更新单个数据资源。
8. RetrieveDestroyAPIView:结合RetrieveAPIView 和 DestroyAPIView 的视图类,用于同时获取和删除单个数据资源。
9. RetrieveUpdateDestroyAPIView:结合RetrieveAPIView、UpdateAPIView 和 DestroyAPIView 的视图类,用于同时获取、更新和删除单个数据资源。

视图基类

APIView

APIView是REST framework提供的所有视图的基类,继承自Django的View类。

APIView与View的不同之处在于:

传入到视图中的request对象是REST framework的Request对象,而不是Django原始的HttpRequest对象

视图可以直接返回REST framework的Response对象,响应数据会根据客户端请求头Accpet自动转换为对应的格式进行返回

任何APIException异常都会被捕获到,并且处理成合适的响应信息返回给客户端

在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制

1.Request对象

视图继承APIView之后,传入视图的request对象是DRF框架提供的Request类的对象,Request类的对象有两个属性:

属性名说明
data包含解析之后的请求体数据,已经解析为了字典或类字典,相当于Django原始request对象的body、POST、FILES属性
query_params包含解析之后的查询字符串数据,相当于Django原始request对象的GET属性

2.Response对象

视图继承APIView之后,响应时可以统一返回Response对象

原始的响应数据,会根据客户端请求头的Accpet,自动转换为对应的格式并进行返回

Accept请求头说明
application/json服务器会将原始响应数据转换为json数据进行返回,没指定Accept时,默认返回json
text/html服务器会将原始响应数据转换为html网页进行返回;

3.APIView的使用

re_path(r'^test/$', views.TestView.as_view(), name='test'),
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.users.models import User
from apps.users.serializers import UserSerializer

class TestView(APIView):

    def get(self, request):
        queryset = User.objects.all()
        # 序列化
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

    def post(self, request):
        # 反序列化-数据校验
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # 反序列化-数据保存
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(APIView):

    def get(self, request, pk):
        try:
            user = User.objects.get(id=pk)
        except User.DoesNotExist:
            raise Http404

        # 数据进行序列化
        serializer = UserSerializer(user)
        print(serializer.data)
        return Response(serializer.data)

    def put(self, request, pk):
        try:
            user = User.objects.get(id=pk)
        except User.DoesNotExist:
            raise Http404

        # 反序列化-数据校验
        serializer = UserSerializer(user, data=request.data)
        serializer.is_valid(raise_exception=True)
        # 反序列化-数据保存
        serializer.save()
        return Response(serializer.data)

    def delete(self, request, pk):
        try:
            user = User.objects.get(id=pk)
        except User.DoesNotExist:
            raise Http404

        user.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

GenericAPIView

GenericAPIView继承自APIVIew,在APIView功能基础上,增加了操作序列化器和数据库查询的方法,作用是为Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。

1.提供的关于序列化器使用的属性与方法

属性:

serializer_class:指明视图使用的序列化器

方法:

get_serializer_class(self) : 返回序列化器类,默认返回serializer_class,可以重写

get_serializer(self, args, **kwargs) : 返回创建序列化器类的对象,如果我们在视图中想要创建序列化器对象,可以直接调用此方法

2.提供的关于数据库查询的属性与方法

属性:

queryset:指明使用的数据查询集

方法:

get_queryset(self):返回视图使用的查询集,默认返回queryset属性,可以重写

get_object(self):返回从视图使用的查询集中查询指定的对象(默认根据pk进行查询),如查询不到,此方法会抛出Http404异常

3.其他可以设置的属性

pagination_class:指明分页控制类

filter_backends:指明过滤控制后端

GenericAPIView的使用

re_path(r'^test/$', views.TestView.as_view(), name='test'),
class TestView(GenericAPIView):
    # 指定视图所使用的序列化器类
    serializer_class = UserSerializer
    # 指定视图所使用的查询集
    queryset = User.objects.all()

    def get(self, request):
        queryset = self.get_queryset()

        # 序列化
        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    def post(self, request):
        # 反序列化-数据校验
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        # 反序列化-数据保存
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)
re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(GenericAPIView):
    # 指定视图所使用的序列化器类
    serializer_class = UserSerializer
    # 指定视图所使用的查询集
    queryset = User.objects.all()

    def get(self, request, pk):
        instance = self.get_object()
        serializer = UserSerializer(instance)
        return Response(serializer.data)

    def put(self, request, pk):
        instance = self.get_object()
        # 反序列化-数据校验
        serializer = UserSerializer(instance, data=request.data)
        serializer.is_valid(raise_exception=True)
        # 反序列化-数据保存
        serializer.save()
        return Response(serializer.data)

    def delete(self, request, pk):
        instance = self.get_object()
        instance.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

Mixin扩展类

使用GenericAPIView,其中代码和视图所使用的序列化器类和查询集已经没有直接关系,DRF其实已经做了封装,就是5个Mixin扩展类。

ListModelMixin

列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。该Mixin的list方法会对数据进行过滤和分页。

class TestView(ListModelMixin, GenericAPIView):
	serializer_class = UserSerializer
    queryset = User.objects.all()

    def get(self, request):
        return self.list(request)

CreateModelMixin

创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。如果序列化器对前端发送的数据验证失败,返回400错误。

class TestView(CreateModelMixin, GenericAPIView):
	serializer_class = UserSerializer
    queryset = User.objects.all()

    def post(self, request):
        print(request.data)
        return self.create(request)

在这里插入图片描述

RetrieveModelMixin

详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。如果存在,返回200, 否则返回404。

 re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(RetrieveModelMixin, GenericAPIView):
	serializer_class = UserSerializer
    queryset = User.objects.all()

    def get(self, request, pk):
        return self.retrieve(request, pk)

UpdateModelMixin

更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。成功返回200,序列化器校验数据失败时,返回400错误。

re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(UpdateModelMixin, GenericAPIView):
	serializer_class = UserSerializer
    queryset = User.objects.all()

    def put(self, request, pk):
        return self.update(request, pk)

在这里插入图片描述
注意:当遇到以下异常时,需要在URL末尾添加/

RuntimeError: You called this URL via PUT, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining PUT data. Change your form to point to 127.0.0.1:8000/test/3/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

DestroyModelMixin

删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。成功返回204,不存在返回404。

re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(DestroyModelMixin, GenericAPIView):
	serializer_class = UserSerializer
    queryset = User.objects.all()

    def delete(self, request, pk):
        return self.destroy(request, pk)

子类视图

Django框架为了方便视图的编写,还提供了9个子类视图类,子类视图类同时继承了GenericAPIView和对应的Mixin扩展类,而且还提供了对应的请求处理方法。

ListAPIView

ListAPIView继承自:GenericAPIView、ListModelMixin,提供get方法

re_path(r'^test/$', views.TestView.as_view(), name='test'),
class TestView(ListCreateAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()

Get http://127.0.0.1:8000/test/

CreateAPIView

CreateAPIView继承自: GenericAPIView、CreateModelMixin,提供 post 方法

RetrieveAPIView

RetrieveAPIView继承自: GenericAPIView、RetrieveModelMixin,提供 get 方法

re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(RetrieveAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()

Get http://127.0.0.1:8000/test/1/

DestoryAPIView

DestoryAPIView继承自:GenericAPIView、DestoryModelMixin,提供 delete 方法

UpdateAPIView

UpdateAPIView继承自:GenericAPIView、UpdateModelMixin,提供 put 和 patch 方法

ListCreateAPIView

ListCreateAPIView继承自:GenericAPIView、ListModelMixin、CreateModelMixin,提供 get 和 post 方法

RetrieveUpdateAPIView

RetrieveUpdateAPIView继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin,提供 get、put、patch方法

RetrieveDestroyAPIView

RetrieveDestroyAPIView继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin,提供 get 和 delete 方法

RetrieveUpdateDestoryAPIView

RetrieveUpdateDestoryAPIView继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin,提供 get、put、patch、delete方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

联想集团ESG与社会价值论坛召开,首次发布《联想集团2022社会价值报告》

对企业而言&#xff0c;ESG不再是选择题&#xff0c;而是必答题。 联想集团是ESG的先行者、领军者。 2023年4月11日&#xff0c;“联想集团ESG与社会价值论坛暨《联想集团2022社会价值报告》发布会”在京召开&#xff0c;会议由中国社会责任百人论坛、联想集团联合主办&#xf…

【图像】协议:常见的图像格式协议对比

1. 背景 不知不觉已经大半年没有写博客了。换了工作之后突然变忙了许多&#xff0c;紧张的项目节点一个接一个&#xff0c;高优先级的事一件接一件&#xff0c;让人兴奋的同时也变得很多时候没有时间去复盘去反思去沉淀。 最近在整理产品的feature list&#xff0c;各种各样的…

Yum方式安装Nginx

前言&#xff1a;使用Nginx源码进行安装过程比较繁琐&#xff0c;需要提前下载安装GCC编译器、PCRE兼容正则表达式库、zlib压缩库和OpenSSL安全通信的软件库包&#xff0c;然后才能进行Nginx的安装。采用Yum最简单的安装方式能自动解决这些安装依赖&#xff0c;默认情况Centos7…

C++面试指南——类常用知识点概念总结

构造函数 构造函数可以抛出异常&#xff0c;可以重载&#xff0c;如果在实例化时在类名后面加个括号&#xff0c;只是创建了一个匿名的对象。构造不能是虚函数&#xff0c;因为此时虚函数表还没有初始化。new对象会调解构造函数。没有定义拷贝构造时&#xff0c;IDE会自动生成…

关于编译的重要概念总结

文章目录什么是GNU什么是GCC / Ggcc / g编译的四个阶段gcc和g的主要区别MinGW-w64C语言版本C 98C 11C 14C 17C 20Makefilecmake回想初学编程的时候&#xff0c;大部分人都是从C语言开始学起的&#xff0c;除了一些常见的语法和思想&#xff0c;一些基础知识常常被人们忽略&…

智能汽车进入3.0时代,双目立体视觉「打通」智驾与底盘

每一次软硬件技术更迭&#xff0c;都在重构智能化。 2016年7月&#xff0c;上汽集团与阿里巴巴合作开发的互联网汽车荣威RX5正式上市&#xff0c;这被视为中国乘用车市场首次规模化引入互联网生态&#xff0c;第一次在软件层面实现对传统燃油车的升级。几个月后&#xff0c;英特…

python机器学习数据建模与分析——数据预测与预测建模

文章目录前言一、预测建模1.1 预测建模涉及的方面&#xff1a;1.2 预测建模的几何理解1.3 预测模型参数估计的基本策略1.4 有监督学习算法与损失函数&#xff1a;1.5 参数解空间和搜索策略1.6 预测模型的评价1.6.1 模型误差的评价指标1.6.2 模型的图形化评价工具1.6.3 训练误差…

“绿菜单”2.0发布 数据中心液冷生态建设进入加速期

近年来&#xff0c;随着数字化社会对算力需求的不断增长&#xff0c;数据中心能耗与散热问题日益凸显。液冷作为更加高效、低能耗的制冷技术&#xff0c;逐渐成为了数据中心建设的热门选择。对此&#xff0c;产业上下游企业热情高涨&#xff0c;液冷产品与方案纷纷亮相&#xf…

【Java】数据类型与变量

一、java中的数据类型 Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。 1.与c语言相同的数据类型 short,int,double,float均与c语言保持相同。 2.与c语言不同的数据类型 byte--字节类型 char--字符类型 java中&#xff0c;byte类型只占一个字节&#xff…

手写简易 Spring(二)

文章目录手写简易 Spring&#xff08;二&#xff09;1. 扩展 BeanFactory 接口2. 实现资源加载器&#xff0c;从 Spring.xml 解析和注册 Bean 对象1. 核心实现类 XmlBeanDefinitionReader3. 实现应用上下文&#xff0c;自动识别、资源加载、扩展机制1. 应用上下文2. 核心实现类…

虚幻图文笔记:Character Creator 4角色通过AutoSetup For Unreal Engine插件导入UE5.1的过程笔记

在UE5端安装AutoSetup For Unreal Engine插件 AutoSetup For Unreal Engine是Reallusion官方提供的免费插件&#xff0c;官方下载地址&#xff0c;下载到的是一个可执行文件&#xff0c;点击安装&#xff0c;记住安装的位置⬇ 看装完毕后会打开一个文件夹&#xff0c;这里就是对…

nginx线程池源码剖析

文章目录nginx线程池1. 问题2. 解决办法 nginx线程池3. 线程池实现模型4. 线程池实现核心组件5.源码实现测试代码main.c封装互斥锁&条件变量线程池实现nginx线程池 1. 问题 处理事件过程“阻塞”怎么办&#xff1f; 忙于漫长的 CPU 密集型处理 读取文件&#xff0c;但文…

HTTP vs HTTPS: 网络通信的加密之争、你真的知道它们的区别吗?

前言 欢迎来到今天的每日一题&#xff0c;每日一提。之前有聊到&#xff0c;TCP/IP协议四层模型。所以我们知道&#xff0c;那四层分别是&#xff1a;应用层、传输层、网络层和数据链路层。那么今天聊一聊应用层里面的一个小知识点&#xff0c;HTTP和HTTPS之间有什么区别&#…

亚马逊被人差评了怎么办?

第一种&#xff1a; 也是最简单的做法就是通过电话或者邮件联系留差评的买家&#xff0c;大致意思就是按照货值的2-3倍作为赔偿&#xff0c;能不能把差评给删了 赔偿一个普通产品2-3倍的价格比起找服务商删一个差评几百到一千不等可以说是绰绰有余了&#xff0c;碰到那种愿意…

AI 工具大全

文章目录ChatGPT 聊天绘画与图像PPTAdoble语音通话捷径指令视频音乐汇集 AI 工具&#xff0c;改变个人办公姿势。拥抱新时代的“通用人工智能”。利用 AI 工具来改造你学习和工作的流程。通过将 AI 嵌入生活和工作的方方面面&#xff0c;你不仅能够获得沉浸式的学习体验&#x…

线上问题:FeignClient循环依赖及源码分析

1 场景复现 依赖关系&#xff1a;虚线左侧为实现的类&#xff0c;虚线右侧为Spring的原生接口类或注解。 正常看&#xff0c;没有循环依赖&#xff0c;但是&#xff0c;实际运行时&#xff0c;异常信息&#xff1a;Is there an unresolvable circular reference? 明确告知&am…

Navidrome - 开源音乐服务器【打造属于自己的音乐播放器】「端口映射」随时随地想听就听

文章目录1. 前言2. Navidrome网站搭建2.1 Navidrome下载和安装2.1.1 安装并添加ffmpeg2.1.2下载并配置Navidrome2.1.3 添加Navidrome到系统服务2.2. Navidrome网页测试3. 本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置4. 公网访问测试5. 结语1. 前言…

十二、市场活动:修改

功能需求 ①、用户在市场活动主页面,选择要修改的市场活动,点击"修改"按钮,弹出修改市场活动的模态窗口; ②、用户在修改市场活动的模态窗口填写表单,点击"更新"按钮,完成修改市场活动的功能. ③、 *每次能且只能修改一条市场活动 ④、*所有者 动态的…

电脑组装教程分享!

案例&#xff1a;如何自己组装电脑&#xff1f; 【看到身边的小伙伴组装一台自己的电脑&#xff0c;我也想试试。但是我对电脑并不是很熟悉&#xff0c;不太了解具体的电脑组装步骤&#xff0c;求一份详细的教程&#xff01;】 电脑已经成为我们日常生活中不可或缺的一部分&a…

Nginx用作 内网CDN / edge cache 服务

文章目录什么是CDN&#xff1f;为什么需要 内网CDN/edge cache?Nginx配置Edge Cache服务配置简单静态文件缓存服务配置缓存控制$upstream_cache_statusGzip压缩参考什么是CDN&#xff1f; 首先要明白什么是CDN&#xff1f; CDN英文全称Content Delivery Network&#xff0c;…