注意:django-filter==22.1(21.1版本正常使用)版本开始已经移除了对filter_fields
和filter_class
的支持(本框架对此已做处理可正常使用),新项目请使用最新的属性filterset_fields
和filterset_class
,用法一致
1、后端接口搜索可直接使用filter_fields (精确搜索,搜索字段一般为设置的字段名)和 search_fields (模糊搜索,搜索字段固定为search)
class MyProgramViewSet(CustomModelViewSet):
"""
自定义搜索 接口:
"""
queryset = MyProgramType.objects.all().order_by('sort')
serializer_class = MyProgramTypeSerializer
filter_fields = ('mobile',)
search_fields = ('name',)
如上filter_fields 搜索mobile=1999xxxx(请把filter_fields更换为filterset_fields)
如上search_fields 搜索search=张三
2、也可使用第三方搜索模块django-filter,定义一个搜索方法如放到utils/filters.py文件中(推荐)
class UsersDateTimeFilter(django_filters.rest_framework.FilterSet):
"""
用户管理 简单过滤器
URL格式:http://127.0.0.1:8000/?start_time=2020-12-02 12:00:00&end_time=2021-12-13 12:00:00
field_name: 过滤字段名,一般应该对应模型中字段名
lookup_expr: 查询时所要进行的操作,和ORM中运算符一致,iexact表示精确匹配, 并且忽略大小写
fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作
exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤
自定义字段名可以和模型中不一致,但一定要用参数field_name指明对应模型中的字段名
"""
#开始时间
start_time = django_filters.DateTimeFilter(field_name='create_datetime', lookup_expr='gte') # 指定过滤的字段
#结束时间
end_time = django_filters.DateTimeFilter(field_name='create_datetime', lookup_expr='lte')
# 模糊搜索
name = django_filters.CharFilter(field_name='name', lookup_expr='icontains') # icontains表示该字段模糊搜索
#外键关键词搜索
zhanzhang = django_filters.CharFilter(field_name='zhanzhang__name',label="站长名称",lookup_expr='icontains')
# 精确搜索
zhanzhang_id = django_filters.CharFilter(field_name='zhanzhang') # 精确搜索
#外键关键词搜索
agent = django_filters.CharFilter(method='my_filter')# 自定义过滤
def my_filter(self, queryset, field_name, value):
myres = Dept.objects.filter(name__contains=value).values_list('id',flat=True)
if not myres:
return myres
my_dept_belong_ids = Dept.objects.filter(parent_id__in=myres).values_list('id',flat=True)
if not my_dept_belong_ids:
return my_dept_belong_ids
return queryset.filter(dept_belong_id__in=my_dept_belong_ids)
class Meta:
model = Users
fields = ['start_time', 'end_time','name', 'age', 'gender', 'mobile','group','zhanzhang','zhanzhang_id','agent']
其中 fields = ['start_time', 'end_time','name', 'age', 'gender', 'mobile','group','zhanzhang','zhanzhang_id','agent']中的字段对应前端的搜索字段名
然后直接再viewset后端接口中调用即可
from utils.filters import UsersDateTimeFilter
class UsersViewSet(CustomModelViewSet):
"""
django-filter搜索 接口:
"""
queryset = Users.objects.all().order_by('sort')
serializer_class = UsersSerializer
filter_class = UsersDateTimeFilter
(请把filter_class 更换为filterset_class)