Django REST Framework自定义过滤FilterSet两种写法区别及查找符含义
两种FilterSet声明方式的核心差异
两种写法的本质区别是支持的过滤查询维度不同:
- 第一种列表写法
fields = ['username', 'last_login']:是django-filter的简化声明方式,仅为每个指定字段开放*exact(精确匹配)*这一种查询规则,你只能通过?username=张三、?last_login=2023-10-01这种完全匹配的参数过滤数据,不支持其他模糊、范围查询。 - 第二种字典写法
fields = {字段名: [查询规则列表]}:是自定义规则的声明方式,可以针对每个字段单独指定开放的查询规则,灵活性更高。示例里的写法就为username开放了精确匹配、包含匹配两种规则,为last_login开放了精确匹配、年份大于指定值两种规则,前端可以根据需要选择对应规则传参过滤。
两个查询表达式的具体含义
这两个都是Django ORM原生支持的字段查询表达式,django-filter直接复用了这套规则:
contains:模糊包含匹配,对应SQL语法中的LIKE %参数值%,会筛选出字段值包含传入参数的所有记录。比如传参?username__contains=张,就能返回所有用户名带“张”字的用户。
补充:如果需要不区分大小写的包含匹配,可以替换为icontains规则。year__gt:日期字段的范围查询组合规则,其中year是提取日期字段的年份值,gt是「大于(greater than)」的缩写,组合后含义为筛选该日期字段年份大于传入参数的记录。比如传参?last_login__year__gt=2022,就能返回所有2023年及之后登录过的用户。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

