0021 基于DRF框架开发(django-filter过滤)

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

  

猜你喜欢

转载自www.cnblogs.com/dorian/p/12383033.html