如何在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
相关产品推荐
相关产品推荐

