Skip to content

注意:django-filter==22.1(21.1版本正常使用)版本开始已经移除了对filter_fieldsfilter_class 的支持(本框架对此已做处理可正常使用),新项目请使用最新的属性filterset_fieldsfilterset_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)

Released under the Apache License 2.0