对于列表数据,可能需要根据字段进行过滤,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接口,测试结果如下:

浙公网安备 33010602011771号