DRF框架中的GenericAPIView类

news2024/12/24 3:32:29

一、GenericAPIView类源码


class GenericAPIView(views.APIView):
    """
    Base class for all other generic views.
    """
    # You'll need to either set these attributes,
    # or override `get_queryset()`/`get_serializer_class()`.
    # If you are overriding a view method, it is important that you call
    # `get_queryset()` instead of accessing the `queryset` property directly,
    # as `queryset` will get evaluated only once, and those results are cached
    # for all subsequent requests.
    queryset = None
    serializer_class = None

    # If you want to use object lookups other than pk, set 'lookup_field'.
    # For more complex lookup requirements override `get_object()`.
    lookup_field = 'pk'
    lookup_url_kwarg = None

    # The filter backend classes to use for queryset filtering
    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS

    # The style to use for queryset pagination.
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS

    def get_queryset(self):
        """
        Get the list of items for this view.
        This must be an iterable, and may be a queryset.
        Defaults to using `self.queryset`.

        This method should always be used rather than accessing `self.queryset`
        directly, as `self.queryset` gets evaluated only once, and those results
        are cached for all subsequent requests.

        You may want to override this if you need to provide different
        querysets depending on the incoming request.

        (Eg. return a list of items that is specific to the user)
        """
        assert self.queryset is not None, (
            "'%s' should either include a `queryset` attribute, "
            "or override the `get_queryset()` method."
            % self.__class__.__name__
        )

        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            # Ensure queryset is re-evaluated on each request.
            queryset = queryset.all()
        return queryset

    def get_object(self):
        """
        Returns the object the view is displaying.

        You may want to override this if you need to provide non-standard
        queryset lookups.  Eg if objects are referenced using multiple
        keyword arguments in the url conf.
        """
        queryset = self.filter_queryset(self.get_queryset())

        # Perform the lookup filtering.
        lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field

        assert lookup_url_kwarg in self.kwargs, (
            'Expected view %s to be called with a URL keyword argument '
            'named "%s". Fix your URL conf, or set the `.lookup_field` '
            'attribute on the view correctly.' %
            (self.__class__.__name__, lookup_url_kwarg)
        )

        filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
        obj = get_object_or_404(queryset, **filter_kwargs)

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj

    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        serializer_class = self.get_serializer_class()
        kwargs.setdefault('context', self.get_serializer_context())
        return serializer_class(*args, **kwargs)

    def get_serializer_class(self):
        """
        Return the class to use for the serializer.
        Defaults to using `self.serializer_class`.

        You may want to override this if you need to provide different
        serializations depending on the incoming request.

        (Eg. admins get full serialization, others get basic serialization)
        """
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer_class()` method."
            % self.__class__.__name__
        )

        return self.serializer_class

    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self
        }

    def filter_queryset(self, queryset):
        """
        Given a queryset, filter it with whichever filter backend is in use.

        You are unlikely to want to override this method, although you may need
        to call it either from a list view, or from a custom `get_object`
        method if you want to apply the configured filtering backend to the
        default queryset.
        """
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset

    @property
    def paginator(self):
        """
        The paginator instance associated with the view, or `None`.
        """
        if not hasattr(self, '_paginator'):
            if self.pagination_class is None:
                self._paginator = None
            else:
                self._paginator = self.pagination_class()
        return self._paginator

    def paginate_queryset(self, queryset):
        """
        Return a single page of results, or `None` if pagination is disabled.
        """
        if self.paginator is None:
            return None
        return self.paginator.paginate_queryset(queryset, self.request, view=self)

    def get_paginated_response(self, data):
        """
        Return a paginated style `Response` object for the given output data.
        """
        assert self.paginator is not None
        return self.paginator.get_paginated_response(data)

二、GenericAPIView介绍

GenericAPIView 是 Django REST Framework(DRF)中的一个基础视图类,它为开发者提供了一些通用的功能和方法,用于快速构建 API 视图。

GenericAPIView 类是通过结合 APIView 和 GenericAPIViewMixin 类而来。它继承了 APIView 类,同时混入了 GenericAPIViewMixin 类中的方法和属性。

 

2.1 GenericAPIView 类的关键特点和常用方法:

2.1.1 提供常用的 HTTP 方法处理函数:

GenericAPIView 类提供了常见的 HTTP 方法处理函数,如

  • get():处理 HTTP GET 请求;
  • post():处理 HTTP POST 请求;
  • put():处理 HTTP PUT 请求;
  • patch():处理 HTTP PATCH 请求;
  • delete():处理 HTTP DELETE 请求;
  • head():处理 HTTP HEAD 请求;
  • options():处理 HTTP OPTIONS 请求

可以通过重写这些方法来实现对不同 HTTP 方法的处理逻辑。

注意:

继承GenericAPIView 类,需要手动重写HTTP 方法处理函数

1、GenericAPIView 类提供了常见的 HTTP 方法处理函数,这些方法实际上是由 APIView 类来实现的

 

GenericAPIView 类继承了 APIView 类,通过混入一些 Mixin 类来扩展其功能。它并没有直接实现所有的 HTTP 方法处理函数,而是借用了 APIView 类中已经实现的相应方法。这些方法包括:

  • get():处理 HTTP GET 请求;
  • post():处理 HTTP POST 请求;
  • put():处理 HTTP PUT 请求;
  • patch():处理 HTTP PATCH 请求;
  • delete():处理 HTTP DELETE 请求;
  • head():处理 HTTP HEAD 请求;
  • options():处理 HTTP OPTIONS 请求。


APIView 类是 DRF 中最基础的视图类,它定义了每个方法对应的默认行为,但这些默认行为通常需要根据具体情况进行自定义实现。因此,GenericAPIView 类作为 APIView 类的子类,提供了更加灵活和可定制的视图功能。

通过继承 GenericAPIView 类,并根据具体需求重写相关的方法,开发者可以很方便地实现自己的视图逻辑和业务处理。在实际使用中,我们一般会结合 GenericAPIView 类的 Mixin 类(如 ListAPIView、RetrieveAPIView 等)来进一步简化开发过程,以实现更具体的功能。

2、支持多种常用的数据操作:

GenericAPIView 类封装了常见的数据操作,包括获取查询集、进行过滤、排序、分页等操作。它提供了一些属性和方法,如 queryset、filter_queryset()、paginate_queryset() 等,通过它们可以轻松实现数据操作的逻辑。

3、内置了常见的 Mixin 类方法:

GenericAPIView 类内置了一些常用的 Mixin 类方法。

以下是 GenericAPIView 类内置的几个常用的 Mixin 类方法:

  1. ListAPIView: 这个 Mixin 类实现了处理 GET 请求返回列表数据的逻辑。它提供了默认的列表数据查询和序列化逻辑,你只需要在子类中指定查询集和序列化器即可。
  2. CreateAPIView: 这个 Mixin 类实现了处理 POST 请求创建资源的逻辑。它提供了默认的请求数据反序列化和保存逻辑,你只需要在子类中指定序列化器即可。
  3. RetrieveAPIView: 这个 Mixin 类实现了处理 GET 请求获取单个资源的逻辑。它提供了默认的资源查询和序列化逻辑,你只需要在子类中指定查询集和序列化器即可。
  4. UpdateAPIView: 这个 Mixin 类实现了处理 PUT/PATCH 请求更新资源的逻辑。它提供了默认的请求数据反序列化、资源查询和保存逻辑,你只需要在子类中指定查询集和序列化器即可。
  5. DestroyAPIView: 这个 Mixin 类实现了处理 DELETE 请求删除资源的逻辑。它提供了默认的资源查询和删除逻辑,你只需要在子类中指定查询集即可。

这些 Mixin 方法可与 GenericAPIView 类一起使用,以构建满足特定需求的视图类。你可以根据需要选择并组合这些 Mixin 类方法,以便在视图类中实现常见的 REST 功能。

例如,如果你想创建一个处理 GET 请求返回列表数据的视图类,你可以从 GenericAPIView 和 ListAPIView 派生一个新的子类,并在子类中指定查询集和序列化器。然后,视图类将自动提供列表数据的查询和序列化功能。

from rest_framework.generics import GenericAPIView, ListAPIView
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer

class MyListView(GenericAPIView, ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

在上面的示例中,我们定义了一个名为 MyListView 的视图类,它继承自 GenericAPIView 和 ListAPIView。我们指定了查询集 (queryset) 和序列化器 (serializer_class),这样视图类就具备了处理 GET 请求返回列表数据的功能。

通过使用这些内置的 Mixin 类方法,可以更轻松地构建出符合需求的视图类,并减少重复代码的编写。

4、支持使用序列化器类:

GenericAPIView 类提供了 serializer_class 属性,用于指定使用的序列化器类。通过 get_serializer() 方法可以获取实例化后的序列化器对象,并在视图中使用它进行数据的序列化和反序列化操作。

5、简化了 API 视图开发:

借助 GenericAPIView 类和相关的 Mixin 类,可以大幅简化 API 视图的开发工作。它们提供了许多通用的方法和属性,减少了重复编写代码的工作量,提高了开发效率。

总而言之,GenericAPIView 类是 DRF 框架中一个非常有用的基础视图类,通过继承和结合相关的 Mixin 类,它提供了许多通用的功能和方法,简化了 API 视图的开发过程。开发者可以根据自己的需求,结合 GenericAPIView 类的特性,快速构建出符合 RESTful 设计风格的 API 视图。

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

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

相关文章

Java中List的使用方法简单介绍

Java中List的使用方法简单介绍 java中的List就是一种集合对象,将所有的对象集中到一起存储。List里面可以放任意的java对象,也可以直接放值。 使用方法很简单,类似于数组。 使用List之前必须在程序头引入java.util.* import java.util.*; pub…

记一次 .NET 某游戏服务后端 内存暴涨分析

一:背景 1. 讲故事 前几天有位朋友找到我,说他们公司的后端服务内存暴涨,而且CPU的一个核也被打满,让我帮忙看下怎么回事,一般来说内存暴涨的问题都比较好解决,就让朋友抓一个 dump 丢过来,接…

Flowable边界事件-错误边界事件

错误边界事件 错误边界事件一、定义1. 图形标记2. 设置错误 选择错误3. XML标记 二、测试用例2.1 错误边界事件xml文件2.2 错误边界事件测试用例 总结 错误边界事件 一、定义 接收到错误编码触发事件 1. 图形标记 2. 设置错误 选择错误 自动审批的配置类配置javaDelegate和抛…

OpenCV安装及案例

目录 常见国内源: 一、简介 二、opencv安装 2.1在虚拟环境中安装 Original error was: No module named ‘numpy.core._multiarray_umath‘ 2.2在conda中安装 三、基本API opencv入门案例: 常见国内源: 清华大学: https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:…

opencv 图像基础处理_灰度图像

opencv 学习2_灰度图像 二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果想要表现更多的细节,就需要使用更多的颜色。例如,图 2-3 中的 lena 图像是一幅灰度图像, 它采用了更多的数值…

HarmonyOS学习路之方舟开发框架—基于ArkTS的声明式开发范式

UI开发(ArkTS声明式开发范式)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建HarmonyOS应用UI所必需的能力,主要包括: ArkTS ArkTS是UI开发语言&#xff0…

Apache Doris (二十五):Doris 数据导入(三)Broker Load-1

目录 1. 基本原理 2. Broker Load语法 进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容! 宝子们订阅、点赞、收藏不迷路!抓紧订阅专题! Apache Doris架构中除了有BE和…

华南农业大学|图像处理与分析技术综合设计|题目解答:定位数显区域并分离电表数字

设计任务 图 28 是一幅正在运行的数字电表图像(ipa28.jpg),试采用图像处理与分析 技术,设计适当的算法和程序,找出电表的数显区域,计算目标区域的长宽比 和像素面积;并提取其中面积最大的 …

免费的云数据库:探索PlanetScale,划分分支的MySQL Serverless平台

最近我发现了一个非常有趣的国外MySQL Serverless平台,它叫做PlanetScale。这个平台不仅仅是一个数据库,它能像代码一样轻松地创建开发和测试环境。你可以从主库中拉出一个与之完全相同结构的development或staging数据库,并在这个环境中进行开…

使用Pycharm

本人没有单独安装python,而是直接安装了anaconda 使用Pycharm创建项目 项目取名为HelloWorld,环境使用前面安装的anaconda pycharm安装模块的方法: 打开Pycharm>File > Settings>Project: Python>Project Interpreter

面试题更新之-hook中setState原理

文章目录 hook是什么?hook中setState原理 hook是什么? 在React中,Hook是一种用于在函数组件中添加状态和其他React特性的函数。它们被引入到React 16.8版本中,旨在解决使用类组件编写复杂逻辑时出现的一些问题。 使用Hook&#…

Redis的哨兵机制

Redis的哨兵机制是一套独立的模式,哨兵可看作是一个独立的进程,该进程发送命令,等待Redis的响应,达到监控Redis服务的作用。 如果在规定的时间内,接收不到Redis服务器的响应,那就说明Redis出现了问题&…

通用文字识别OCR 之实现自动化办公

摘要 随着技术的发展,通用文字识别(OCR)已经成为现代办公环境中不可或缺的工具之一。OCR技术可以将印刷或手写文本转换为可编辑或可搜索的数字文本,极大地提高了办公效率并实现了自动化办公。本文将深入探讨OCR技术在实现自动化办…

Promise的理解和使用(从入门到精通)

Promise的理解和使用 1.1Promise是什么 1、抽象表达 Promise是一门新的技术(ES6规范)Promise是JS进行异步编程的新解决方案(旧方案是单纯的使用回调函数) 2、具体表达: 从语法上来说:Promise是一个构造…

C++—C++程序基础

文章目录 1 数据类型1.1 基本数据类型1.2 字面值常量1.3 左值和右值1.4 引用与指针 2 基本输入输出2.1 输出2.2 输入 3 函数3.1 内联函数3.2 函数的重载 1 数据类型 1.1 基本数据类型 在C中,除了C语言中的int,char,float,double…

小程序主包超1.5MB分包处理流程优化方案

"subPackages": [// 分包1 {"root": "src, // 根目录"pages": [{"path": "views/business/index", // 页面路径"name": "business_index","aliasPath": "/business/index",&…

2023年9月广州/重庆/长沙/深圳DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息,2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启,相关事宜通知如下: 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

浅析神经网络模型算法在手写文字识别中的重要作用

神经网络模型是什么?与OCR有何不同? 神经网络模型是一种机器学习算法,用于对数据进行模式识别和预测,可应用于各种任务包括图像识别、自然语言处理等。而OCR(Optical Character Recognition)是一种特定的应…

我在阴影之中 - InsCode Stable Diffusion 美图活动一期

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…