首页 > 其他分享 >django-rest-framework-从零开始-6-视图类GenericAPIView的使用

django-rest-framework-从零开始-6-视图类GenericAPIView的使用

时间:2023-03-21 18:47:22浏览次数:69  
标签:GenericAPIView 调用 get 视图 django 方法 serializer

django-rest-framework-从零开始-6-视图类GenericAPIView的使用

1、前言

  • 之前提到过的基于APIView类的视图,需要重写["get","post","put","patch", "delete","head","options","trace"]等方法,来达到处理请求的目的。

  • 基于APIView类的视图,核心功能都是一样的,如果我们有多个模型,则需要所有模型都写一个基于APIView类的视图,然后修改其中的模型类和序列化类,这样看起来,代码就重复了很多。

  • 是否有一个类,可以直接完成这些功能,只需要告诉它模型类和序列化类。它就可以自己生成这些方法,并补充完其中的函数体。

2、创建GenericAPIView类视图

上面我们需要一个类,直接完成绑定请求视图的功能。django-rest-framework提供了一些类,可以用于实现以上功能。

改造student_manager/views.py文件

class StudentList(generics.GenericAPIView,
                  mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  ):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class StudentDetail(generics.GenericAPIView,
                    mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

图示

image-20230317111422747

修改student_manager/urls.py路由,指定视图参数pk

re_path(r'detail/(?P<pk>[0-9]+)/', StudentDetail.as_view()),

图示

image-20230317134349455

说明:

  • 我们要基于类的视图,那肯定要继承APIView类,但APIView类无法知道我们的模型类和序列化类都分别是什么,因此django-rest-framework封装了一个类,名叫GenericAPIView类,该类继承了APIView类,因此继承它后,我们也需要定义对应的["get","post","put","patch", "delete","head","options","trace"]方法。

  • GenericAPIView类多了一些方法,能识别模型类和序列化类。我们通过定义GenericAPIView类中querysetserializer_class属性,告知我们的模型类和序列化类。也可以通过重写GenericAPIView类中的get_queryset()get_serializer_class()告知我们的模型类和序列化类

    • 注意:当我们重写了视图类,即重写了["get","post","put","patch", "delete","head","options","trace"]方法,在视图中,如果我们需要获取模型类时,应该调用get_queryset()方法,而不是访问queryset属性,这是drf的约定。

      image-20230317112602261

  • 我们重写了get,post,put,delete方法,这些方法都直接调用了对应mixins文件中的各个基类,完成视图的自动适配。

    • 重写了StudentListget方法,调用了ListModelMixinlist方法,list方法中调用了GenericAPIView类的filter_queryset方法和get_serializer方法,所以最终还是使用了GenericAPIView类和它的基类APIView类的方法。只是绑定了get请求来临时,调用list方法。

    • 重写的post方法,调用了CreateModelMixin类的create方法,create方法中调用了GenericAPIView类的get_serializer方法,最终调用了序列化类的save方法,save方法,还是调用序列化类的create方法(这是之前就了解到的了)。

    • 重写了StudentDetail中的get方法,调用了RetrieveModelMixinretrieve方法,retrieve方法调用了GenericAPIView类的get_object()get_serializer方法

    • 重写了put方法,调用了UpdateModelMixin的update方法,update方法调用了GenericAPIView类的get_object()get_serializer方法以及最终调用了序列化类的save方法,save方法,还是调用序列化类的create方法(这是之前就了解到的了)。

    • 重写了delete方法,调用了DestroyModelMixindestory方法,destory方法调用了GenericAPIView类的get_object()最终调用了模型类的delete方法

      大概就是表中样子,具体可以看源码

      视图方法 对应视图基类及方法 调用GenericAPIView类的函数
      List中的get方法 ListModelMixin:list() get_queryset()和get_serializer()
      post CreateModelMixin:create() get_serializer()
      Detail的get方法 RetrieveModelMixin:retrieve() get_object()和get_serializer()
      put UpdateModelMixin:update() get_object()和get_serializer()
      delete DestroyModelMixin:destory() get_object()
  • 这里要注意的是,URL路由的写法,需要为(?Ppattern) 这种写法

3、启动服务,测试基于GenericAPIView类视图

测试和之前一样。

github:https://github.com/rainbow-tan/learn-drf

标签:GenericAPIView,调用,get,视图,django,方法,serializer
From: https://www.cnblogs.com/rainbow-tan/p/17240980.html

相关文章

  • django-rest-framework-从零开始-3-序列化类ModelSerializer的使用
    django-rest-framework-从零开始-3-序列化类ModelSerializer的使用1、前言我们之前提到创建序列化类,需要继承serializers.Serializer类,然后映射模型类的字段,然后重写crea......
  • django-rest-framework-从零开始-2-序列化类serializers.Serializer的使用
    django-rest-framework-从零开始-2-序列化类serializers.Serializer的使用1、前言我们编写的django程序,需要与前端或者其他程序交互,通常会提供出自己的API接口,此时需要把......
  • Python Django 加法计算器案例
    创建add应用在templates内新建add.html文件:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Co......
  • Python Django 登陆案例
    在根目录下新建一个templates文件将该目录添加到settings.py文件内在templates文件夹内新建一个login.html文件,并写入模板内容<!DOCTYPEhtml><htmllang="z......
  • django中使用分页器功能
    要使用Django实现分页器,必须从Django中导入Paginator模块fromdjango.core.paginatorimportPaginator假如现在有150条记录要显示,每页显示10条>>>fromdjango.co......
  • 三步打开RabbitMq视图
    RabbitMQ视图使用docker下载安装rabbitMQ#5672是mq默认的端口号#15672是mq默认外界访问的视图端口号#3.10-management指定版本dockerrun-d--restart=alwa......
  • mysql视图
    1.常见的数据库对象2.视图2.1为什么使用视图视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的......
  • mysql-connector-python驱动和django-mysql-pool连接池
    ##################### 为了设计一个公用的、安全的连接池接口,可以考虑以下几个方面:封装连接池初始化和获取连接的逻辑,使得调用者不需要了解连接池的具体实现细节,只需要调......
  • django-rest-framework-从零开始-1-创建项目
    django-rest-framework-从零开始-1-创建项目1、下载模块python-mpipinstalldjangopython-mpipinstalldjangorestframework本次学习基于python3.9,python安装......
  • django-rest-framework-从零开始-3-序列化类ModelSerializer的使用
    django-rest-framework-从零开始-3-序列化类ModelSerializer的使用1、前言我们之前提到创建序列化类,需要继承serializers.Serializer类,然后映射模型类的字段,然后重写crea......