zoukankan      html  css  js  c++  java
  • DRF框架GenericAPIView之过滤查询

    GenericAPIView为APIView的子类,它拓展了过滤、查询、分页的功能,本章主要介绍过滤的使用方法

    一、引入方式

    from rest_framework.generics import GenericAPIView

    二、GenericAPIView

    • 视图继承GenericAPIView
    • 往往要指定queryset类属性,表示当前接口需要使用到的查询集(查询集对象)
    • 往往要指定serializer_class类属性,表示当前接口需要使用到的序列化器类
    • 在对应的请求方法中,使用self.get_queryset()方法,获取查询集对象,建议不要直接使用self.queryset
    • 可以使用self.get_serializer()方法调用序列化器类
    from rest_framework.response import Response
    from rest_framework import status
    from rest_framework.generics import GenericAPIView
    from .models import Projects
    from .serializers import ProjectsModelSerializer
    
    
    class ProjectsPage(GenericAPIView):
        '''
        类视图
        '''
        queryset = Projects.objects.all()
        serializer_class = ProjectsModelSerializer
    
        def get(self, request):
            qs = self.get_queryset()
            serializer_obj = self.get_serializer(instance=qs, many=True)
            return Response({'code': 0, 'res': "success", 'msg': serializer_obj.data}, status=status.HTTP_200_OK)

    三、过滤

    1.安装django-filter第三方库

    pip install -i https://pypi.douban.com/simple django-filter

    2.配置django-filter

    在项目下的settings.py模块中全局指定过滤引擎

    INSTALLED_APPS = [
        'django_filters'
    ]

    3.引入方式

    from django_filters.rest_framework import DjangoFilterBackend

    4.使用方法

    a.在视图中指定过滤引擎,也可以在全局指定

    1)视图中指定,如果要指定多个引擎,直接继续添加到该列表中
    filter_backends = [DjangoFilterBackend]
    2)全局指定

    在项目下的settings.py模块下的REST_FRAMEWORK中设置属性

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': 'django_filters.rest_framework.backends.DjangoFilterBackend'
    }

    b.指定需要过滤的字段,过滤的字段需要与模型类中的字段保持一致

    filterset_fields = ['name', 'leader', 'programmer', 'tester']

    c.调用self.filter_queryset()方法,传递一个查询集对象,并返回一个查询集

    from rest_framework.response import Response
    from rest_framework import status
    from rest_framework.generics import GenericAPIView
    from django_filters.rest_framework import DjangoFilterBackend
    from .models import Projects
    from .serializers import ProjectsModelSerializer
    
    
    class ProjectsPage(GenericAPIView):
        '''
        类视图
        '''
        queryset = Projects.objects.all()
        serializer_class = ProjectsModelSerializer
    
        filter_backends = [DjangoFilterBackend]
        filterset_fields = ['name', 'leader', 'programmer', 'tester']
    
        def get(self, request):
            qs = self.get_queryset()
            qs = self.filter_queryset(qs)
            serializer_obj = self.get_serializer(instance=qs, many=True)
            return Response({'code': 0, 'res': "success", 'msg': serializer_obj.data}, status=status.HTTP_200_OK)

    查询结果展示:

  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/13337956.html
Copyright © 2011-2022 走看看