【DRF】 类视图

系列文章目录

第四章 类视图


文章目录

  • 系列文章目录
  • 类视图
  • APIView:
  • Mixins:
  • Generic类视图:
  • GenericAPIView介绍:
    • queryset:
    • serializer_class:
    • lookup_field和lookup_url_kwarg:
    • 分页:
    • 重写方法:


类视图

在DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。

APIView:

APIView是DRF中类视图最基本的父类。基本用法跟Django中自带的View类是一样的。也是自己分别实现get、post等方法。示例代码如下:

class MerchantView(APIView):
    """
    检索, 更新和删除一个merchant实例对象.
    """
    def get_object(self, pk):
        try:
            return Merchant.objects.get(pk=pk)
        except Merchant.DoesNotExist:
            raise Http404

    def get(self, request, pk=None):
        if pk:
            merchant= self.get_object(pk)
            serializer = MerchantSerializer(merchant)
            return Response(serializer.data)
        else:
            queryset = Merchant.objects.all()
            serializer = MerchantSerializer(instance=queryset,many=True)
            return Response(serializer.data)

    def put(self, request, pk):
        merchant = self.get_object(pk)
        serializer = MerchantSerializer(merchant, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

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

当然APIView中还继承了一些常用的属性,比如authentication_classes、permission_classes、throttle_classes等。

Mixins:

mixins翻译成中文是混入,组件的意思。在DRF中,针对获取列表,检索,创建等操作,都有相应的mixin。示例代码如下:

from .models import Merchant
from .serializers import MerchantSerializer
from rest_framework import mixins
from rest_framework import generics

class MerchantView(
    generics.GenericAPIView,
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin,
    mixins.CreateModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin
):
    queryset = Merchant.objects.all()
    serializer_class = MerchantSerializer

    def get(self,request,pk=None):
        if pk:
            return self.retrieve(request)
        else:
            return self.list(request)

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

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

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

以上我们通过继承generics.GenericAPIView,可以设置queryset以及serializer_class,那么视图函数就知道你是要针对哪个模型做处理,你的序列化的类是什么了。接着我们继承mixins.ListModelMixin/CreateModelMixin类,这样MerchantList就拥有了获取列表,以及创建数据的功能。下面我们通过写get和post方法,调用self.list和self.create方法,就可以轻松的实现获取商家列表和创建商家的功能。

Generic类视图:

以上我们通过mixin可以非常方便的实现一些CURD操作。实际上针对这些mixin,DRF还进一步的进行了封装,放到generics下。有以下generic类视图:
generics.ListAPIView:实现获取列表的。实现get方法。
generics.CreateAPIView:实现创建数据的。实现post方法。
generics.UpdateAPIView:实现更新数据的。实现put方法。
generics.DestroyAPIView:实现删除数据的。实现delete方法。
generics.RetrieveAPIView:实现检索数据的。
generics.ListCreateAPIView:实现列表和创建数据的。
generics.RetrieveUpdateAPIView:实现检索和更新数据的。
generics.RetrieveDestroyAPIView:实现检索和删除数据的。
generics.RetrieveUpdateDestroyAPIView:实现检索和更新和删除数据的。
用法如下:

    generics.CreateAPIView,
    generics.UpdateAPIView,
    generics.DestroyAPIView,
    generics.RetrieveAPIView
):
    serializer_class = MerchantSerializer
    queryset = Merchant.objects.all()

那么在定义url与视图映射的时候,还是按照之前的写法就够了:

urlpatterns = [
    path('merchant/',views.MerchantView.as_view()),
    path('merchant/<int:pk>/',views.MerchantView.as_view())
    # path('category',views.goods_category,name="category")
]

请求的url和method产生的结果如下:

methodurl结果
get/merchant/31/获取id=31的merchant数据
post/merchant/添加新的merchant数据
put/merchant/31/修改id=31的merchant数据
delete/merchant/31删除id=31的merchant数据

因为这里retrieve占用了get方法,所以如果想要实现获取列表的功能,那么需要再重新定义一个url和视图:

# views.py
class MerchantListView(generics.ListAPIView,):
    serializer_class = MerchantSerializer
    queryset = Merchant.objects.all()

# urls.py
urlpatterns = [
    path('merchant/',views.MerchantView.as_view()),
    path('merchant/<int:pk>/',views.MerchantView.as_view()),
    path('merchants/',views.MerchantListView.as_view())
    ...
]

这也是为什么List和Retrieve不能同时存在一个视图中的原因。

GenericAPIView介绍:

如果想要深入学会generic的一些用法。比如如何分页,如何过滤数据等。那么这时候就需要学习GenericAPIView的使用。

queryset:

queryset是用来控制视图返回给前端的数据。如果没什么逻辑,可以直接写在视图的类属性中,如果逻辑比较复杂,也可以重写get_queryset方法用来返回一个queryset对象。如果重写了get_queryset,那么以后获取queryset的时候就需要通过调用get_queryset方法。因为queryset 这个属性只会调用一次,以后所有的请求都是使用他的缓存。

serializer_class:

serializer_class用来验证和序列化数据的。也是可以通过直接设置这个属性,也可以通过重写get_serializer_class来实现。

lookup_field和lookup_url_kwarg:

lookup_field:是在检索的时候,根据什么参数进行检索。默认是pk,也就是主键。
lookup_url_kwarg:在检索的url中的参数名称。默认没有设置,跟lookup_field保持一致。

分页:

分页是通过设置pagination_class来实现的。默认这个属性的值是rest_framework.pagination.PageNumberPagination,也就是通过控制页码,每页的数量来实现的。我们可以通过在settings.REST_FRAMEWORK中设置PAGE_SIZE来控制每页的数量,然后在url中通过传递page参数来获取指定页数的数据。

重写方法:

  1. get_queryset(self):
    用于动态的返回一个queryset对象。
  2. get_object(self):
    用于在数据检索的时候,返回一条数据的。
  3. perform_create(self,serializer):
    保存对象的时候调用。
  4. perform_update(self,serializer):
    更新对象的时候调用。
  5. perform_destroy(self,serializer):
    删除对象的时候调用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的免税商品优选购物商城(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着全球贸易的日益繁荣和消费者需求的多样化&#xff0c;免税商品购物已成为众多旅行者和消费者的热…

浸没式密封连接器

在当今科技快速发展的背景下&#xff0c;电子设备的整合度与性能需求持续提高&#xff0c;而连接技术作为电子设备间交互的关键&#xff0c;其重要性显而易见。在各式各样的连接技术当中&#xff0c;浸没式密封连接器凭借其独到设计和高超性能&#xff0c;在特定使用环境中显示…

SpringBoot3中ymal配置文件(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 在SpringBoot项目中,使用application.properties进行配置管理时&#xff0c;…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 目录 文章目录 [大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26目录论文信息摘要主要内容包括&#xff1a;研究方法与资源的分类&#xff1a;结论&#xff1a; 论文信息 Title: Recent Advancement …

vector中push_back和emplace_back的区别

push_back 在引入右值引用&#xff0c;转移构造函数&#xff0c;转移复制运算符之前&#xff0c;通常使用push_back()向容器中加入一个右值元素&#xff08;临时对象&#xff09;的时候&#xff0c;首先会调用构造函数构造这个临时对象&#xff0c;然后需要调用拷贝构造函数将…

后端Java-SpringBoot整合MyBatisPlus步骤(超详细)

1.新建项目。 2.点击完上一步的next之后&#xff0c;选择pom.xml文件中的依赖。 3.点击pom文件进行项目初始化。 按照下面的俩步骤刷新一下maven &#xff0c;让文件生效 4.新建一个application.yml文件 5. 新建一个数据库mp&#xff0c;在数据库中新建一张user表 6.连接数据…

onnx TRT 版本对应关系

Onnx 版本和opset 关系 https://github.com/onnx/onnx/blob/main/docs/Versioning.md Onnx runtime 对应 onnx opset 版本 Compatibility | onnxruntime Tensor RT 和onnx 支持版本可以看如下并选择对应分支 https://github.com/onnx/onnx-tensorrt/blob/release/8.4-GA/doc…

三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码

文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…

【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

Halcon基础系列1-基础算子

1 窗口介绍 打开Halcon 的主界面主要有图形窗口、算子窗口、变量窗口和程序窗口&#xff0c;可拖动调整位置&#xff0c;关闭后可在窗口下拉选项中找到。 2 显示操作 关闭-dev_close_window() 打开-dev_open_window (0, 0, 712, 512, black, WindowHandle) 显示-dev_display(…

如何理解矩阵的复数特征值和特征向量?

实数特征值的直观含义非常好理解&#xff0c;它就是在对应的特征向量方向上的纯拉伸/压缩。 而复数特征值&#xff0c;我们可以把它放在复数域中理解。但是这里给出一个不那么简洁、但是更加直观的理解方式&#xff1a;把它放在实空间中。那么复数特征值表现的就是旋转等比放大…

自动驾驶汽车横向控制方法研究综述

【摘要】 为实现精确、稳定的横向控制&#xff0c;提高车辆自主行驶的安全性和保障乘坐舒适性&#xff0c;综述了近年来自动驾驶汽车横向控制方法的最新进展&#xff0c;包括经典控制方法和基于深度学习的方法&#xff0c;讨论了各类方法的性能特点及在应用中的优缺点&#xff…

《深度学习》OpenCV 指纹验证、识别

目录 一、指纹验证 1、什么是指纹验证 2、步骤 1&#xff09;图像采集 2&#xff09;图像预处理 3&#xff09;特征提取 4&#xff09;特征匹配 5&#xff09;相似度比较 6&#xff09;结果输出 二、案例实现 1、完整代码 2、实现结果 调试模式&#xff1a; 三、…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析&#xff0c;如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储&#xff08;也会涉及收费问题&#xff09;&#xff0c;通过组态软件…

Oracle数据恢复—异常断电导致Oracle数据库报错的数据恢复案例

Oracle数据库故障&#xff1a; 机房异常断电后&#xff0c;Oracle数据库启库报错&#xff1a;“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。数据库没有备份&#xff0c;归档日志不连续。用户方提供了Oracle数据库的在线文件&#xff0c;需要恢复zxf…

仕考网:事业单位考试选岗小技巧!

事业单位的考试选岗阶段&#xff0c;应该综合考量多个方面&#xff0c;确保选择出更合适的岗位&#xff0c;仕考网为大家分享以下技巧&#xff1a; 1. 岗位性质及工作内容 岗位性质:深入了解岗位是管理类、专业技术类还是工勤技能类&#xff0c;以及相应的职责和要求。 工作…

解决 Macos下 Orbstack docker网络问题

两种解决方法&#xff0c;第一种开代理 参考 —— 但是我这一种没成功&#xff0c;第二种方法是换镜像源 { "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://mirrors.tencent.com&q…

openKylin--安装 .net6.0

编辑profile文件 cd .. //切换到根目录 cd /etc //切换到etc目录 vim profile //b编辑profile文件 1. 按→键移动到文件末尾 2. 按Insert键进入编辑模式 3. 按Enter另起一行开始编辑 export DOTNET_ROOT/home/dotnetexport PATH$PATH:/home/dotnet 可以通过右键--粘贴 的…

【Android 14源码分析】WMS-窗口显示-第二步:relayoutWindow -1

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…