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

如何在Django DRF端点URL查询时排除空值

实现Django动态URL参数排除空值查询

1. 单字段动态过滤

在视图的get_queryset方法里解析URL参数,根据参数值动态调整查询集:

def get_queryset(self):
    queryset = super().get_queryset()
    # 获取URL里的my_field__isempty参数
    is_empty_param = self.request.query_params.get('my_field__isempty')
    if is_empty_param is not None:
        # 把参数转成布尔值,兼容大小写
        is_empty = is_empty_param.lower() == 'true'
        if is_empty:
            # 只保留my_field为空的记录
            queryset = queryset.filter(my_field="")
        else:
            # 排除my_field为空的记录
            queryset = queryset.exclude(my_field="")
    return queryset

请求/api/object?my_field__isempty=False时,就会自动排除my_field为空的条目;传True则只返回空值条目。

2. 多字段通用过滤(可选)

如果多个字段需要类似的空值过滤功能,可以写通用逻辑批量处理:

def get_queryset(self):
    queryset = super().get_queryset()
    query_params = self.request.query_params
    
    # 遍历所有带__isempty后缀的参数
    for param in query_params:
        if param.endswith('__isempty'):
            # 提取字段名
            field_name = param.rsplit('__isempty', 1)[0]
            is_empty_value = query_params.get(param).lower() == 'true'
            
            if is_empty_value:
                queryset = queryset.filter(**{f"{field_name}": ""})
            else:
                queryset = queryset.exclude(**{f"{field_name}": ""})
    return queryset

比如请求/api/object?name__isempty=False&email__isempty=True,就能同时筛选出name非空、email为空的记录。

注意事项

  • URL参数都是字符串,要做好布尔值转换,确保true/True都能被识别为真;
  • 如果要过滤数据库中的NULL值(不是空字符串),把代码里的""换成None即可。

内容的提问来源于stack exchange,提问作者John R Perry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:10:22