DRF自带的过滤
- 第一个 DjangoFilterBackend 是需要安装三方库见[搜索:多字段筛选]
- 两外两个是安装注册了rest_framework就有。
如上图,只要配置了三个箭头所指的方向,就能使用。
第一个单字段过滤
用户视图集中加上filterset_fields 后,后端搜索过滤就生效了
特点:
- 是准确匹配,如搜王老五,能搜索来,搜老五,是搜不出来的
第二个关键字过滤
配置SearchFilter, 即可实现。就不举例了。
# 后端过滤、搜索与排序
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
现在已经知道使用djangRF 视图集定义的接口,比如列表接口 可以加参数 ?search=xxx , 进行数据的过滤。
第三个排序
也不举例了,见 添加链接描述
这三个的原理
简单总结得说
:
- 就是DjangoFilterBackend, SearchFilter, OrderingFilter三个类中有一个filter_queryset的方法, 传入一个querySet,返回过滤后的querySet。
不清楚得看下面源码说明
, 接口都使用了 filter_queryset 方法。
而filter_queryset 是GenericAPIView 类中的代码如下:
(大致逻辑:给一个querySet,返回出过滤后的 querySet)
def filter_queryset(self, queryset):
"""
Given a queryset, filter it with whichever filter backend is in use.
You are unlikely to want to override this method, although you may need
to call it either from a list view, or from a custom `get_object`
method if you want to apply the configured filtering backend to the
default queryset.
"""
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
结合已有知识可知,
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
继续观察上面代码的写法(如下图)
每一项backend后面都.filter_queryset ,
说明SearchFilter 或者 OrderingFilter 和DjangoFilterBackend 这是三个类,且里面都有filter_queryset 的方法
:
看源码,果然是 ,它们的filter_queryset 里面就有过滤逻辑:
自定义过滤
针对第一个单字段过滤,修改成模糊匹配
找个地方写py文件,如在utils包下,新建一个取名为filters.py 的文件
import django_filters
from system.models import User
class UsersManageFilter(django_filters.rest_framework.FilterSet):
"""
用户管理 简单过滤器
URL格式:http://127.0.0.1:8100/?start_time=2022-10-02 08:00:00&end_time=2023-12-31 23:59:59
"""
# 1.创建时间从
start_time = django_filters.DateTimeFilter(field_name='create_datetime', lookup_expr='gte')
# 2.创建时间到
end_time = django_filters.DateTimeFilter(field_name='create_datetime', lookup_expr='lte')
# 3.用户名-模糊搜索
username = django_filters.CharFilter(field_name='username', lookup_expr='icontains')
# 4.姓名号码-模糊搜索
realname = django_filters.CharFilter(field_name