zoukankan      html  css  js  c++  java
  • GenericAPIView的使用及和视图扩展类的结合使用

    GenericAPIView的使用

    from rest_framework.generics import GenericAPIView
    GenericAPIView继承 APIView,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展
    
    因此也是需要进行序列化的三个步骤,但是是使用GenericAPIView的时候,必须要有一个前提,就是:必须申明当前视图类中操作的模型数据是
    queryset = BookInfo.objects.all()  # 必须申明当前视图类中操作的模型数据是什么,
    也可以选择性的增加 serializer_class = BookInfoModelSerializer  # 可以声明当前要调用的序列化器是什么

    1、利用GenericAPIView获取所有 的数据

    完整的例子: # views.py
    # GeneriaAPIView的使用
    from rest_framework.generics import GenericAPIView
    from app01.serializers import BookInfoModelSerializer
    from rest_framework.response import Response
    class BookInfoGenericAPIView(GenericAPIView):
        queryset = BookInfo.objects.all()  # 必须申明当前视图类中操作的模型数据是什么
        serializer_class = BookInfoModelSerializer  # 可以声明当前要调用的序列化器是什么
        def get(self,request):
    
            print("reqeust的数据是",request)  #  <rest_framework.request.Request object at 0x000000FA185102B0> 对象
            # 第一步:操作数据 获取所有数据
            data_list=self.get_queryset()
            print("data_Lists数据是",data_list)  # 从数据库中查询到的QuerySet 数据 列表
            # 第二步  序列化
            serializer=self.get_serializer(instance=data_list,many=True)
            print("serializer的数据是>>",serializer)
            # 第三步L:响应数据
            return  Response(serializer.data)
    
    # urls.py 
    from django.urls import path,re_path
    from . import views
    
    urlpatterns=[
        # as_view是继承的APIView
        path("app03/",views.BookInfoGenericAPIView.as_view()), 
    ]

    2、利用GenericAPIView获取一条数据

    view.py

    # 利用GenericAPIView获取一条数据,需要传入当前查询的数据的pk值
        from rest_framework.generics import GenericAPIView
        from app01.serializers import BookInfoModelSerializer
        from booktest.models import BookInfo
        from rest_framework.response import Response
    class BookInfo2GenericAPIView(GenericAPIView):
        # GenericAPIView必须要要queryset 和 serilizer_class
        queryset = BookInfo.objects.all() # 申明当前操作的模型数据是什么
        serializer_class = BookInfoModelSerializer # 声明当前使用的序列化器什么
    
        def get(self,request,pk):
            print("执行没?")
            # 三步骤:
            # 第一步:操作数据,根据id获取一条数据[使用self.get_object的前提是路由中必须声明一个pk的路由参数,
            # 如果没有这个参数,则报错]
            book=self.get_object()
            print("book〉〉",book)  # book〉〉 图书:《射雕英雄传》
            # 第二步:序列化
            serializer=self.get_serializer(instance=book)
            print("serializer>>",serializer) # s是一个serialzer的模型的显示
            # 第三步:响应数据
    
            return Response(serializer.data)

    urls.py

    from django.urls import path,re_path
    from . import views
    
    urlpatterns=[
        re_path("app03/(?P<pk>d+)",views.BookInfo2GenericAPIView.as_view()),
    
    ]

    ps:

    ps:
    01: serializer=self.get_serializer(instance=book)其中的参数说明
    ##### get_serializer(self, *args, **kwargs)
    
    返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。
    
    **注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。**
    
    - **request** 当前视图的请求对象
    - **view** 当前请求的类视图对象
    - format 当前请求期望返回的数据格式
    
    02:**get_object(self)**
    返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。
    
    在试图中可以调用该方法获取详情信息的模型类对象。
    
    **若详情访问的模型类对象不存在,会返回404。**
    
    该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
    
    举例:
    # url(r'^books/(?P<pk>d+)/$', views.BookDetailView.as_view()),
    class BookDetailView(GenericAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        def get(self, request, pk):
            book = self.get_object() # get_object()方法根据pk参数查找queryset中的数据对象
            serializer = self.get_serializer(book)
            return Response(serializer.data)

    3、利用GenriacAPIView结合mixins的5个扩展视图类进行数据的增删改查询

    '''
    GericAPIView可以和视图扩展类进行结合,来快速简化视图方法的代码
    提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,
    则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
    这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。
    
    mixins内的五个视图扩展类:
        ListModelMixin列表视图扩展类,提供`list(request, *args, **kwargs)`方法快速实现列表视图,返回200状态码。
        该Mixin的list方法会对数据进行过滤和分页。
        
        CreateModelMixin :创建视图扩展类,提供`create(request, *args, **kwargs)`方法快速实现创建资源的视图,成功返回201状态码。
        如果序列化器对前端发送的数据验证失败,返回400错误。
        
         RetrieveModelMixin:详情视图扩展类,提供`retrieve(request, *args, **kwargs)`方法,可以快速实现返回一个存在的数据对象。
        如果存在,返回200, 否则返回404。
        
        UpdateModelMixin:更新视图扩展类,提供`update(request, *args, **kwargs)`方法,可以快速实现更新一个存在的数据对象。
        同时也提供`partial_update(request, *args, **kwargs)`方法,可以实现局部更新。
        成功返回200,序列化器校验数据失败时,返回400错误
        
        DestroyModelMixin:删除视图扩展类,提供`destroy(request, *args, **kwargs)`方法,可以快速实现删除一个存在的数据对象。
        成功返回204,不存在返回404。
    
    '''

    views.py

    from rest_framework.generics import GenericAPIView
    from booktest.models import BookInfo
    from app01.serializers import BookInfoModelSerializer
    from rest_framework import mixins
    
    '''
    mixins 类中有5个视图函数,这个五个视图函数有不同的作用,但是基本是
    对数据的增删改查视图 
    '''
    class BookInfoMixinAPIView(GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
        # 必须要先声明 queryset和serializer_class
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoModelSerializer
    
        # 查询获取所有数据
        def get(self, request):
            return self.list(request)
    
        # 添加数据
        def post(self,request):
    
            return self.create(request)  # CreateModelMixin内部有创建函数
    
    
    from rest_framework.generics import GenericAPIView
    from rest_framework import mixins
    from app01.serializers import BookInfoSerializer
    from booktest.models import BookInfo
    # 通过GericAPIView和mixins下的修改,删除,获取一条数据来编写简化版的视图函数
    class BookInfo2MixinAPIView(GenericAPIView, mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin):
        # 必须要先声明 queryset和serializer_class
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoModelSerializer
    
        # 获取一条数据
        def get(self,request,pk):
    
            return self.retrieve(request,pk)
    
        # 更新一条数据
        def put(self, request, pk):
    
            return self.update(request,pk)
    
        # 删除一条数据
        def delete(self,request,pk):
    
            return self.destroy(request,pk)

    urls.py

    from django.urls import path,re_path
    from . import views
    
    urlpatterns=[
        # re_path("app03/(?P<pk>d+)/",views.BookInfo3APIView.as_view()),
        path("app03/",views.BookInfoGenericAPIView.as_view()),
        re_path("app03/(?P<pk>d+)",views.BookInfo2GenericAPIView.as_view()),
        path("book01/",views.BookInfoMixinAPIView.as_view()),
        re_path("book02/(?P<pk>d+)",views.BookInfo2MixinAPIView.as_view()),
    
    ]
  • 相关阅读:
    GIT基础详解
    JS进阶解析
    JS基础解析
    CSS布局模型解析
    02.CentOS Linux 7.7 系统配置文档
    docker 创建bridge网络和修改默认网段
    selenium浏览器自动化测试工具 进阶使用
    前端导出Excel和打印介绍
    stm32使用gmtime()转换timestamp为日期,出的结果是乱的,不符合预期。改为localtime正常输出
    .net core api action 不能用作 httpget注释的参数名
  • 原文地址:https://www.cnblogs.com/one-tom/p/11345446.html
Copyright © 2011-2022 走看看