过滤组件
过滤组件的使用
有三种使用方式
方式一:使用drf内置过滤类
第一步:保证视图类继承 GenericAPIView 及其子类
# 以图书类为例 class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer
第二步:导入过滤类的相关模块
from rest_framework.filters import SearchFilter
第三步:在类中配置属性
filter_backends = [SearchFilter] # search_fields = ['name'] # 既能按名字,又能按价格 search_fields = ['name', 'price']
完整代码如下:
class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [SearchFilter] search_fields = ['name', 'price']
第四步:前端访问方式
搜索方式固定——必须是?search=xx
ttp://127.0.0.1:8000/api/v1/books/?search=1 只要名字或price中有1关键字,都能搜出来
缺点:自带模块不支持 name=西游记&price=33 这种过滤方式,因此我们可以借助第三方模块
方式二:使用第三方 django-filter 过滤类
第一步:下载django-filter模块
pip3 install django-filter
第二步:导入模块
from django_filters.rest_framework import DjangoFilterBackend
第三步:视图类配置使用
class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['name', 'price']
第四步:前端访问
http://127.0.0.1:8000/api/v1/books/?name=西游记&price=11 #支持同时查询书名为西游记并且价格为11 的图书
缺点:模块不支持模糊查询,只能精准匹配,因而我们可以自定义一个过滤类
方式三:自定义过滤类(CommonFilter)
第一步:创建一个py文件 以filters.py为例
第二步:导入过滤类相关模块
from rest_framework.filters import BaseFilterBackend
第三步:继承 BaseFilterBackend 重写 filter_queryset 方法
class CommonFilter(BaseFilterBackend): def filter_queryset(self, request, queryset, view): # queryset 之前所有的数据 Book.objects.all() # request 当次请求request # 自定义模糊查询 if request.query_params.get('name'): queryset = queryset.filter(name__contains=request.query_params.get('name')) if request.query_params.get('price'): queryset = queryset.filter(price=request.query_params.get('price')) if request.query_params.get('price__gt'): queryset = queryset.filter(price__gt=request.query_params.get('price__gt')) return queryset
以上代码包含:模糊查询书名、精准查询价格、查询价格大于一个自定义值
第四步:视图类调用使用自定义过滤类
# 实现 名字模糊匹配,价格精准匹配 from .filters import CommonFilter class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [CommonFilter]
第五步:前端访问
http://127.0.0.1:8000/api/v1/books/?name=西 # 模糊查询名字内含西的图书 http://127.0.0.1:8000/api/v1/books/?price=33 # 精准查询价格为33的图书 http://127.0.0.1:8000/api/v1/books/?price__gt=22 # 查询大于22的图书