如何在Django的drf_filters.FilterSet中实现gte、lte及空值过滤
在drf_filters.FilterSet中实现字段的gte/lte及空值过滤
要给custom_field同时实现gte、lte和空值过滤,有两种常用方案:
方案一:自定义过滤字段(推荐,参数名更友好)
显式定义每个过滤规则对应的字段,你可以自定义前端传递的参数名,比如用custom_field_null来触发空值匹配:
from django_filters import rest_framework as drf_filters from . import models class CustomFilterSet(drf_filters.FilterSet): # 保留原有的gte/lte过滤 custom_field_gte = drf_filters.NumberFilter(field_name='custom_field', lookup_expr='gte') custom_field_lte = drf_filters.NumberFilter(field_name='custom_field', lookup_expr='lte') # 添加空值过滤:参数为true时匹配custom_field为空的记录,false则匹配非空记录 custom_field_null = drf_filters.BooleanFilter(field_name='custom_field', lookup_expr='isnull') class Meta: model = models.CustomModel fields = [] # 已显式定义过滤字段,此处留空即可
使用方式
前端请求时可组合使用参数:
- 过滤
custom_field大于等于10的记录:?custom_field_gte=10 - 过滤
custom_field为空的记录:?custom_field_null=true - 组合过滤:
?custom_field_gte=5&custom_field_lte=20&custom_field_null=false(匹配大于等于5且小于等于20的非空记录)
方案二:利用自动生成的lookup参数
如果可以接受带双下划线的参数名,只需在fields字典中添加'isnull',无需额外定义字段:
from django_filters import rest_framework as drf_filters from . import models class CustomFilterSet(drf_filters.FilterSet): class Meta: model = models.CustomModel fields = { 'custom_field': ('lte', 'gte', 'isnull') }
使用方式
前端需通过custom_field__isnull参数触发空值过滤:
- 匹配空值:
?custom_field__isnull=true - 组合gte和非空条件:
?custom_field__gte=10&custom_field__isnull=false
两种方案都能满足需求,可根据你的API参数设计习惯选择。
内容的提问来源于stack exchange,提问作者Ajax
相关产品推荐
相关产品推荐

