对于列表数据,可能需要根据字段进行过滤,DRF可以通过添加django-filter来增强支持。
1 安装django-filter(已安装)
2 在配置文件中增加过滤后端的设置。
INSTALLED_APPS = [ ... 'django_filters', # 需要注册应用, ] REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) }
3 精确查找
打开Applications/Examples/views/Schools.py,找到最后一个视图,增加指定过滤字段。
class SchoolViewSet(GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin): queryset = Schools.objects.all() serializer_class = SchoolsSerializer filter_fields = ('name',)
指定该过滤字段,只能用于精确查询,DRF会自动把该参数传到前端,要求前端在查询时,提供这些字段。
4 运行接口文档,找到SchoolViewSet中的list方法,输入查找条件,即可看到如下效果:
5 自定义过滤器
在Applications/Examples/下创建一个filters.py文件,用于存储该APP中的过滤器。新增一个过滤器,代码如下:
import django_filters from .models import Schools class SchoolFilter(django_filters.rest_framework.FilterSet): """ 【参数说明】 lookup_expr表示查询方式,有以下可选项: startswith:表示以什么开头,istartswith:表示忽略大小写 endswith:表示以什么结尾,iendswith:表示忽略大小写 contains:表示包含,icontains表示忽略大小写 gt:表示大于,gte表示大于等于 lt:表示小于,lte表示小于等于 isnull:表示为空 exact:表示精确匹配,iexact表示忽略大小写 """ name = django_filters.CharFilter(name='name', lookup_expr='icontains') class Meta: model = Schools fields = ['name', ]
6 在视图中引用自定义过滤器
打开Applications/Examples/views/Schools.py,修改最后一个类:
from rest_framework import filters class SchoolViewSet(GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin): queryset = Schools.objects.all() serializer_class = SchoolsSerializer filter_backends = (filters.SearchFilter,) search_fields = ('name',)
7 运行工程,在接口文档中找到SchoolViewSet的list接口,测试结果如下: