zoukankan      html  css  js  c++  java
  • 关于类视图选择继承APIView还是工具视图(ListAPIView、CreateAPIView等等)

    APIView使用方法,直接继承APIView,get或者post请求。方法很简单1.先获取到要操作的数据,然后把数据放到serializer中序列化或者反序列化,最后return返回值(记得.data

    1.第一个例子

     2.第二个例子

     主要流程:获取到数据对象,然后传入到serializer中校验,最后response返回前端数据(注意返回的数据要.data)

    工具视图(ListAPIView,CreataAPIView等)

    https://www.cnblogs.com/wangcuican/p/11710450.html 工具视图学习资料

    我们要知道上面这些工具视图是继承GenericAPIView和Mixins各种工具类的

    GenericAPIView

    我们要先了解GenericAPIView的用法(比如下面的)(******)

    先写GenericAPIView的两个属性:queryset(指明视图需要的数据,这个主要是针对从数据库中获取数据,如果是从前端获取数据就不用写queryset了,数据就从reqeust中获取)和serializer_class指明视图使用哪个序列化器

    如果你写了上面的两个属性,就必须需要使用get_queryset和get_serializer进行操作(特别需要注意******)

    get_queryset功能:从类属性queryset中获取model的queryset数据

    get_serializer功能:从类属性serializer_class中获得serializer的序列化类,主要是给Mixin扩展类使用

    from rest_framework.generics import GenericAPIView
    class BookGenericAPIView(GenericAPIView):
        queryset = models.Book.objects.filter(is_delete=False)
        serializer_class = serializers.BookModelSerializer
        # 自定义主键的 有名分组 名
        lookup_field = 'pk'    #先定义好,单取可以使用
        # 群取
        def get(self, request, *args, **kwargs):
            book_query = self.get_queryset()  #获取queryset数据(model查询数据)
            book_ser = self.get_serializer(book_query, many=True)  #我的理解是数据被[]嵌套就要写many=True(book_query查出来是queryset类型,如果查出来是object就不用写many=True)
            book_data = book_ser.data   #返回前台的数据必须需要.data,才能返回(******)
            return APIResponse(results=book_data)
    
        # 单取
        def get(self, request, *args, **kwargs):
            book_query = self.get_object()
            book_ser = self.get_serializer(book_query)
            book_data = book_ser.data
            return APIResponse(results=book_data)

    Mixins各种工具类(配合GenericAPIView一起使用

    mixins有五个工具类文件,一共提供了五个工具类,六个工具方法:单查、群查、单增、单删、单整体改、单局部改
    五个工具类CreateModelMixin(增加),DestroyModelMixin(删除),ListModelMixin(查询,查queryset),RetrieveModelMixin(查询,查对象,针对于存在"pk"),UpdateModelMixin(修改)

    举例子

    现在我们就有疑问了,前面说了用GenericAPIView,就必须要get_queryset()和serializer_class()。这里Mixins工具类也使用了GenericAPIView为什么没见这两个方法。

    get_queryset()和serializer_class()这两个方法在list,create等源码方法中

    源码:(针对增加数据的源码create)这里面用到了get_serializer,所以我们在这之前就必须设定一个serializer_class方法。

     举例子:Create增加的用法(这里我们直接用CreateAPIView方法,在源码中已经继承GenericAPIView和Mixin工具类。就不用再去自定义类,然后继承GenericAPIView和Mixin工具类这种麻烦的操作

    from rest_framework.generics import CreateAPIView
    class RegisterCreateAPIView(CreateAPIView):
        serializer_class = serializers.RegisterModelSerializer    
    
        #重写create方法,CreateModelMixin中的create方法,下面这段代码是到create源码中粘贴过来的(******)
        def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data) 
            serializer.is_valid(raise_exception=True)  # 校验失败就主动抛异常 => 自定义异常结果,配置异常模块
            user_obj = serializer.save()  # 要自定义入库逻辑,重写serializer中的create方法
            headers = self.get_success_headers(serializer.data)
            # 响应结果需要格式化,使用序列化类要提供序列化与反序列化两套规则
         #返回前端的数据APIResponse
    return APIResponse(0, 'ok', results=serializers.RegisterModelSerializer(user_obj).data, http_status=201, headers=headers )

    这里我们为什么要重写create方法呢,因为想自定义返回值APIResponse,如果你不需要重写方法,那么这个类下面只写queryset和serializer_class这两个属性就行了。

  • 相关阅读:
    CloudFlare Workers 反代任意网站和挂载单页代码
    排查Linux服务器是否有被入侵方法总结
    修复Windows time时间服务无法自动启动的问题
    如何删除windows服务
    linux之NetHogs与nload流量监控
    常用IPV4 DNS服务器与常用IPV6 DNS服务器
    Win10系统如何删除网络及修改网络名称
    window修改远程桌面RDP方法
    单击鼠标右键菜单显示怎么在左边?
    传统IDC机房部署网站
  • 原文地址:https://www.cnblogs.com/wangcuican/p/11894547.html
Copyright © 2011-2022 走看看