如何在Django API视图中,无有效查询键时返回空QuerySet
问题说明
当前使用django-filter和djangorestframework实现Symbol数据的模糊搜索,存在不符合需求的行为:
- 当请求不带
st查询参数时,接口返回所有Symbol数据 - 需要调整为:
- 无
st参数时返回空结果 - 有
st参数但筛选后无匹配数据时,也返回空结果
- 无
解决方案
通过调整视图逻辑和FilterSet的处理规则,实现需求:
1. 修正FilterSet定义
完善SymbolFilter,确保空搜索值也返回空结果,并显式声明不需要默认过滤字段:
# filters.py import django_filters from .models import Symbol class SymbolFilter(django_filters.FilterSet): st = django_filters.CharFilter(method='get_st', label='search') def get_st(self, queryset, field_name, value): # 若搜索值为空字符串,直接返回空QuerySet if not value.strip(): return queryset.none() return queryset.filter(title__icontains=value) class Meta: model = Symbol fields = [] # 禁用默认字段过滤,仅使用自定义的st过滤器
2. 调整视图逻辑
在视图中先判断st参数是否存在,不存在则直接返回空结果;存在则执行过滤,过滤后无结果也返回空:
# views.py from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from .models import Symbol from .serializers import SymbolSerializer from .filters import SymbolFilter @api_view(['GET']) def symbol_list(request): # 无st参数时直接返回空结果 if 'st' not in request.GET: return Response([], status=status.HTTP_200_OK) queryset = Symbol.objects.all() view_filter = SymbolFilter(request.GET, queryset=queryset) # 过滤后无匹配数据,返回空结果 filtered_qs = view_filter.qs if not filtered_qs: return Response([], status=status.HTTP_200_OK) ser = SymbolSerializer(filtered_qs, many=True) return Response(ser.data, status=status.HTTP_200_OK)
3. 修正视图中的Filter引用错误
原代码中使用了未定义的APIFilters.APISymbolFilter,替换为正确导入的SymbolFilter即可。
验证效果
- 请求
localhost:8000/symbol/list/(无st参数):返回空数组[] - 请求
localhost:8000/symbol/list/?st=不存在的标题:返回空数组[] - 请求
localhost:8000/symbol/list/?st=sometitle:返回匹配的Symbol数据
内容的提问来源于stack exchange,提问作者rahnama7m
相关产品推荐
相关产品推荐

