DRF框架GenericAPIView之过滤查询
Posted 小公瑾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
查询结果展示:
以上是关于DRF框架GenericAPIView之过滤查询的主要内容,如果未能解决你的问题,请参考以下文章
DRF框架之视图基类APIView和GenericAPIView简介