首页 > 其他分享 >DRF之视图组件

DRF之视图组件

时间:2024-04-22 22:35:24浏览次数:22  
标签:返回 get queryset 视图 组件 序列化 方法 DRF

【四】视图组件

微信图片_20240422210120

图源:drf(详细)_51CTO博客_什么是drf

【1】两个视图基类

【1.1】APIView

  • 请在【View】中查看详细

【1.2】GenericAPIView

【1.2.1】常用类属性
  • 基本设置:

    • 以下属性控制着基本视图的行为。

    • queryset

      • 用于从视图返回对象的查询结果集。
      • 通常,你必须设置此属性或者重写 get_queryset() 方法。
      • 如果你重写了一个视图的方法,重要的是你应该调用 get_queryset() 方法而不是直接访问该属性,因为 queryset 将被计算一次,这些结果将为后续请求缓存起来。
    • serializer_class

      • 用于验证和反序列化输入以及用于序列化输出的Serializer类。
      • 通常,你必须设置此属性或者重写get_serializer_class() 方法。
    • lookup_field

      • 用于执行各个model实例的对象查找的model字段。默认为 'pk'
      • 请注意,在使用超链接API时,如果需要使用自定义的值,你需要确保在API视图序列化类设置查找字段。
    • lookup_url_kwarg

      • 应用于对象查找的URL关键字参数。它的 URL conf 应该包括一个与这个值相对应的关键字参数。
      • 如果取消设置,默认情况下使用与 lookup_field相同的值。
  • Pagination:

    • 以下属性用于在与列表视图一起使用时控制分页。

    • pagination_class

      • 当分页列出结果时应使用的分页类。
      • 默认值与 DEFAULT_PAGINATION_CLASS 设置的值相同,即 'rest_framework.pagination.PageNumberPagination'
  • Filtering:

    • filter_backends
      • 用于过滤查询集的过滤器后端类的列表。
      • 默认值与DEFAULT_FILTER_BACKENDS 设置的值相同。
【1.2.2】常用方法
  • get_queryset(self)

    • 返回列表视图中实用的查询集,该查询集还用作详细视图中的查找基础。
    • 默认返回由 queryset 属性指定的查询集。
    • 这个方法应该总是被调用而不是直接访问 self.queryset ,因为 self.queryset 只会被计算一起,然后这些结果将为后续的请求缓存起来。
    • 该方法可能会被重写以提供动态行为,比如返回基于发出请求的用户的结果集。
  • get_object(self)

    • 返回应用于详细视图的对象实例。
    • 默认使用 lookup_field 参数过滤基本的查询集。
    • 该方法可以被重写以提供更复杂的行为,例如基于多个 URL 参数的对象查找。
  • get_serializer_class(self)

    • 返回应用于序列化的类。默认为返回 serializer_class 属性的值。

    • 可以被重写以提供动态的行为,例如对于读取和写入操作使用不同的序列化器,或者为不同类型的用户提供不同的序列化器。

【1.2.3】其他方法
  • 你通常并不需要重写以下方法,虽然在你使用 GenericAPIView 编写自定义视图的时候可能会调用它们。
    • get_serializer_context(self)
      • 返回包含应该提供给序列化程序的任何额外上下文的字典。默认包含 'request', 'view''format' 这些keys。.
    • get_serializer(self, instance=None, data=None, many=False, partial=False)
      • 返回一个序列化器的实例。
    • get_paginated_response(self, data)
      • 返回分页样式的 Response 对象。
    • paginate_queryset(self, queryset)
      • 如果需要分页查询,返回页面对象,如果没有为此视图配置分页,则返回 None
    • filter_queryset(self, queryset)
      • 给定查询集,使用任何过滤器后端进行过滤,返回一个新的查询集。

【2】五个视图扩展类

  • Mixin 类提供用于提供基本视图行为的操作。
  • 注意mixin类提供动作方法,而不是直接定义处理程序方法,例如 .get().post(), 这允许更灵活的行为组成。
  • Mixin 类可以从 rest_framework.mixins导入。
视图扩展类 功能 方法
ListModelMixin 如果查询集被填充了数据,则返回 200 OK 响应,将查询集的序列化表示作为响应的主体。相应数据可以任意分页。 提供一个 .list(request, *args, **kwargs) 方法,实现列出结果集。
CreateModelMixin 如果创建了一个对象,这将返回一个 201 Created 响应,将该对象的序列化表示作为响应的主体。如果序列化的表示中包含名为 url的键,则响应的 Location 头将填充该值。
如果为创建对象提供的请求数据无效,将返回 400 Bad Request,其中错误详细信息作为响应的正文。
提供 .create(request, *args, **kwargs) 方法,实现创建和保存一个新的model实例
RetrieveModelMixin 如果可以检索对象,则返回 200 OK 响应,将该对象的序列化表示作为响应的主体。否则将返回 404 Not Found 提供一个 .retrieve(request, *args, **kwargs) 方法,实现返回响应中现有模型的实例。
UpdateModelMixin 如果一个对象被更新,这将返回一个 200 OK 响应,将对象的序列化表示作为响应的主体。
如果为更新对象提供的请求数据无效,将返回一个 400 Bad Request 响应,错误详细信息作为响应的正文。
提供 .update(request, *args, **kwargs) 方法,实现更新和保存现有模型实例。
同时还提供了一个 .partial_update(request, *args, **kwargs) 方法,这个方法和 update 方法类似,但更新的所有字段都是可选的。这允许支持 HTTP PATCH 请求。
DestroyModelMixin 如果删除对象,则返回 204 No Content 响应,否则返回 404 Not Found 提供一个 .destroy(request, *args, **kwargs) 方法,实现删除现有模型实例

【3】九个视图子类

  • Generic views - Django REST framework中文站点 (q1mi.github.io)
  • 这些视图子类遵循了通用的设计原则,封装了常见的 API 操作,使得开发人员能够以更高效、更简洁的方式编写 API 视图。
  • 同时,它们也提供了灵活性,允许开发人员通过继承和混合来自定义和扩展功能,以满足特定的业务需求。
  • 这些视图类可以从 rest_framework.generics导入
视图子类 功能 继承 方法
CreateAPIView 用于 仅创建 端点。 GenericAPIView
CreateModelMixin
post
ListAPIView 用于 只读 端点以表示模型实例集合 GenericAPIView
ListModelMixin
get
RetrieveAPIView 用于只读 端点以表示单个模型实例 GenericAPIView
RetrieveModelMixin
get
DestroyAPIView 用于只删除端点以表示单个模型实例 GenericAPIView,
DestroyModelMixin
delete
UpdateAPIView 用于只更新端点以表示单个模型实例 GenericAPIView
UpdateModelMixin
put / patch
ListCreateAPIView 用于读写端点以表示模型实例的集合 GenericAPIView
ListModelMixin
CreateModelMixin
get / post
RetrieveUpdateAPIView 用于 读取或更新 端点以表示 单个模型实例 GenericAPIView
RetrieveModelMixin
UpdateModelMixin
get / put /patch
RetrieveDestroyAPIView 用于 读取或删除 端点以表示 单个模型实例 GenericAPIView
RetrieveModelMixin
DestroyModelMixin
get / delete
RetrieveUpdateDestroyAPIView 用于 读写删除 端点以表示 单个模型实例 GenericAPIView,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin
get /put /patch /delete

【4】视图集

  • DRF允许你将一组相关视图的逻辑组合在单个类(称为 ViewSet)中。
  • 在其他框架中,你也可以找到概念上类似于 'Resources' 或 'Controllers'的类似实现。
  • ViewSet 只是一种基于类的视图,它不提供任何方法处理程序(如 .get().post()),而是提供诸如 .list().create() 之类的操作。
  • ViewSet 的方法处理程序仅使用 .as_view() 方法绑定到完成视图的相应操作。
  • 通常不是在 urlconf 中的视图集中显示注册视图,而是要使用路由类注册视图集,该类会自动为你确定 urlconf。

【4.1】ViewSetMixin

  • 重写了 .as_view() 方法,使其接受一个 actions 关键字参数,用于将 HTTP 方法与资源的动作进行绑定
    • 【注】所有继承了ViewSetMixin的视图类,在路由中都需要传递actions参数
    • actions参数通常为字典形式视图类.as_view({'请求方式':'执行的方法名'})
      • 如:MyViewSet.as_view({'get': 'list', 'post': 'create'})
  • 使用时,注意继承ViewSetMixin时需要在最左侧class CommonView(ViewSetMixin,ListAPIView)

【4.2】四种视图集

视图集 功能 继承 方法
ViewSet ViewSet 继承自 APIView。你可以使用任何标准属性,如 permission_classes, authentication_classes 以便控制视图集上的 API 策略。 ViewSetMixin,
views.APIView
ViewSet 类不提供任何操作的实现。为了使用 ViewSet 类,你将重写该类并显式地定义动作实现。
GenericViewSet GenericViewSet 类继承自 GenericAPIView,并提供了 get_object, get_queryset 方法和其他通用视图基本行为的默认配置,但默认情况不包括任何操作。 ViewSetMixin,
generics.GenericAPIView
为了使用 GenericViewSet 类,你需要覆盖该类并且要么混合所需的混合类,要么明确定义动作的实现。
ModelViewSet ModelViewSet 类继承自 GenericAPIView,并通过混合各种混合类的行为来实现各种动作 mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet
ModelViewSet 类提供的动作包括 .list().retrieve().create().update().partial_update() .destroy()
ReadOnlyModelViewSet ReadOnlyModelViewSet 类也继承自 GenericAPIView。 mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet
与 ModelViewSet 类类似,它也包括各种动作的实现,但与 ModelViewSet 不同的是,它只提供了“只读”动作,即 .list() .retrieve()

标签:返回,get,queryset,视图,组件,序列化,方法,DRF
From: https://www.cnblogs.com/Lea4ning/p/18151722

相关文章

  • DRF之View和APIView
    【零】DRF在Django项目中的使用【1】导入#DRF需要使用pipinstall安装pipinstalldjangorestframeworkDRF(DjangoRestFramework)是一个用于构建WebAPI的工具包,它是基于Django框架的一个第三方应用(app)在Django项目中,一个应用(app)通常是一个具有特定功能的模块,它包......
  • DRF之序列化组件
    【二】序列化组件【1】序列化与反序列化的概念序列化(Serialization):将对象转换为可传输或可存储的格式的过程。在序列化过程中,对象的属性和数据被转换为一个字节流或字符串,以便在网络上传输或保存到文件中。常见的序列化格式包括JSON、XML、ProtocolBuffers等。序列化后的数......
  • DRF之请求与响应
    【三】请求与响应【1】请求【1.1】Request对象def__init__(self,request,parsers=None,authenticators=None,negotiator=None,parser_context=None)关键字参数:-request(HttpRequest).原始请求实例。-parsers(list/tuple).用于解析请求内容......
  • DRF之View和APIView
    【零】DRF在Django项目中的使用【1】导入```shell#DRF需要使用pipinstall安装pipinstalldjangorestframework```DRF(DjangoRestFramework)是一个用于构建WebAPI的工具包,它是基于Django框架的一个第三方应用(app)在Django项目中,一个应用(app)通常是一个具有特定功......
  • 前端【uniapp】02-uniapp【全局文件】【组件【内置、扩展】】【声明周期】【API调用】
    一、uni-app基础知识uni-app是组合了Vue和微信小程序的相关技术知识,要求大家同时俱备Vue和原生小程序的开发基础。1、全局文件在小程序中有全局样式、全局配置等全局性的设置,为此在uni-app中也有一些与之相对应的全局性的文件。uni.scssuni-app项目在运......
  • DRF案例
    1反序列化更新,instance就传要修改的对象,保证修改完成defupdate(self,instance,validated_data):publish_id=validated_data.pop('publish')author_id=validated_data.pop('author')forkinvalidated_data:setattr(instance,k,valida......
  • 4+1 视图建模及架构设计工程实践
    ​占春良:碧桂园服务技术专家,项目架构师,前阿里资深软件工程师,12年技术开发经验。​01前言架构设计建模的目的是通过统一的UML语言,完成业务的梳理,并对业务系统进行合理的组织(分层、分模块),以提高系统的可扩展性、可重用性、可移植性、易理解性和易测试性,从而达到一个高质量属性的......
  • forms组件
    forms组件【一】介绍Forms组件是用来处理用户提交的数据,并将其转换成Python可处理的数据类型。Forms组件提供了一种简单的方式来定义表单的结构以及验证用户输入的数据。通过使用Forms组件,你可以有效地处理用户输入的数据,包括验证、转换以及显示错误信息。【二】基本使用fro......
  • drf中jwt应用
    第一步 在登录类中生成jwtclassLogin(MyException,APIView):defpost(self,request):user_obj=models.UserInfo.objects.filter(**request.data).first()ifnotuser_obj:returnResponse({"code":1001,"msg":"用户......
  • vue.js 3 上传文件:el-upload 组件
    "@element-plus/icons-vue":"^2.3.1","axios":"^1.6.8","element-plus":"^2.6.2","pinia":"^2.1.7","pinia-plugin-persistedstate":"^3.2.1","vue":&......