美文网首页
DRF使用篇(七):APIView与GenericAPIView

DRF使用篇(七):APIView与GenericAPIView

作者: 是立品啊 | 来源:发表于2020-07-13 21:59 被阅读0次

    006.DRF中类视图中的两个基类

    APIview

    • APIViewREST framework提供的所有视图的基类, 继承自DjangoView父类

    APIView与View的不同之处:

    • 传入到视图方法中的是REST frameworkRequest对象, 而不是DjangoHttpRequeset对象;
    • 视图方法可以返回REST frameworkResponse对象, 视图会为响应数据设置(render)符合前端要求的格式;
    • 任何APIException异常都会被捕获到, 并且处理成合适的响应信息;
    • 在进行dispatch()分发前, 会对请求进行身份认证 权限检查 流量控制

    APIView支持定义的属性:

    • authentication_classes 列表或元祖, 身份认证类
    • permissoin_classes 列表或元祖, 权限检查类
    • throttle_classes 列表或元祖, 流量控制类

    注意在APIview中仍然需要常规的定义get(), post() 或者其他请求方式的方法

    from rest_framework.views import APIView
    from rest_framework.response import Response
    # 继承自APIView
    class StudentAPIView(APIView):
        def get(self, request)
            sutdents = StudentInfo.objects.all()
            serializer = StudentInfoSerializer(many=True, students)
            return Response(serializer.data)
    

    GenericAPIView

    • rest_framework.generics.GenericAPIView继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法. 通常使用时, 可搭配一个或多个Mixin扩展类

    支持定义的属性:

    (list / retrieve)列表视图与详情视图通用:

    queryset: 列表视图的查询集
    serializer_class: 视图使用的序列化器

    (list)列表视图专用:

        - ` pagination_class`: 分页控制类
        - `filter_backends`: 过滤控制后端
    

    (retrieve)详情页视图使用:

        - `lookup_field` 查询单一数据库对象时使用的条件字段,默认为`'pk'`, 可以指定为`'id'`;
        - `filter_backends`:` lookup_url_kwarg` 查询单一数据时`URL`中的参数关键字名称,默认与`look_field`相同
    

    (list / retrieve)通用支持的方法

        - `get_queryset(self):`返回视图使用的查询集, 是列表视图与详情视图获取数据的基础, 默认返回queryset属性, 可以重写, 控制其返回的查询集
    
    class StudentAPIView(APIView):
        def get_queryset(self):
            keyword = self.request.query_params.get("keyword")# 尝试从request的查询字符串中获得keyword(用户想搜索的用户)
            if keyword:# 判断过滤的keyword存不存在(端传没传), 如果前端传了就返回给前端相关的用户
                return self.queryset.filter(username__contains=keyword)
            return self.queryset.all().order_by('id')
    
        - `get_serializer_class(self)`返回序列化器类,默认返回serializer_class,可以重写,例如:
    
    class StudentAPIView(APIView):
        def get_serializer_class(self):
            if self.request.user.is_staff: # 判断用户是否是超级管理员
                return FullAccountSerializer # 就使用详细的序列化器
            return BasicAccountSerializer
    
        - `get_serializer(self, args, *kwargs)`
    
    - 返回序列化器对象, 被其他视图或扩展类使用, 如果我们在视图中想要获取序列化器对象, 可以直接调用此方法。
    - 注意!在提供序列化器对象的时候, REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。
    

    (retrieve)详情页支持的方法

    - `get_object(self)`
        - 返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象
        - 若详情访问的模型类对象不存在,会返回404
        - 该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问
    
    url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
    class StudentAPIView(GenericAPIView):
        queryset = StudentInfo.objects.all() # 指定要操作的数据库
        serializer_class = StudentInfoSerializer # 指定序列化器
        def get(self, request, pk): # 重写get方法
            student = self.get_object() # 得到前端跟随路径传进来的pk值 从数据库进行查找并得到一个对象
            serializer = self.get_serializer(student) # 进行序列化操作得到一个序列化器对象
            return Response(serializer.data)
    

    相关文章

      网友评论

          本文标题:DRF使用篇(七):APIView与GenericAPIView

          本文链接:https://www.haomeiwen.com/subject/ywozcktx.html