- 1. 第一步,views 中导入 filters,
from rest_framework import filters
- 2. 第二步,方法函数中,用什么功能就引用对应模块
filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter,)
DjangoFilterBackend :过滤字段--------价格范围
filters.SearchFilter :搜索--------搜索框
filters.OrderingFilter :排序--------价格从大到小
- 3.1 搜索:
比如要搜索user表(modle)中的 姓名(name)和年龄(age)
search_fields = ('name', 'age')
- 3.1.1 搜索有四个功能:
'^' 以指定内容开始.
'=' 完全匹配
'@' 全文搜索(目前只支持Django的MySQL后端)
'$' 正则搜索
如搜索 完全匹配名字,以年龄内容开始
search_fields = ('=name', '^age')
- 3.2 过滤字段:
创建一个过滤类,以年龄范围为例,在哪里创建都行,只要导入到你的视图views方法中就行
import django_filters #导入 django_filters过滤模块 from .models import User #导入 引入model自己的表,以User为例 # 定义过滤类 class UserFilter(django_filters.rest_framework.FilterSet): """商品过滤类""" age_min = django_filters.NumberFilter(field_name="age", lookup_expr='gte') #要过滤什么字段写什么,以age为例。 age_max = django_filters.NumberFilter(field_name="age", lookup_expr='lte') #要过滤什么字段写什么,以age为例。 class Meta: model = Goods fields = ['age_min ', 'age_max '] # 在Meta中指定过滤哪些字段 #要过滤什么字段写什么,以age为例。
- 导入进视图方法
filter_class = UserFilter
- 3.3 排序字段:
ordering_fields = ('age')
过滤器中年龄排序,效果和 order_by一样
-
完整代码
class UserViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): """搜索、过滤、排序""" queryset = User.objects.all(). serializer_class = UserSerializer #自己创建序列化器 filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,) filter_class = UserFilter search_fields = ('name', 'age') ordering_fields = ('age')