You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:58:15