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

如何在Django API视图中,无有效查询键时返回空QuerySet

问题说明

当前使用django-filter和djangorestframework实现Symbol数据的模糊搜索,存在不符合需求的行为:

  • 当请求不带st查询参数时,接口返回所有Symbol数据
  • 需要调整为:
    1. 无st参数时返回空结果
    2. 有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:55:23