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

Django REST Framework API返回空列表问题求助

问题描述

正在开发一个Django REST Framework(DRF)接口,其中一个视图返回空列表。在Django Shell中执行Paper.objects.annotate(search=SearchVector('abstract', 'title'),).filter(search='Type')能得到预期结果,但使用requests请求http://127.0.0.1:8000/api/search/?search=Type时返回空列表,调用json.loads(re)还会触发类型错误:TypeError: the JSON object must be str, bytes or bytearray, not Response。

视图代码

@api_view(['GET'])
def post_search(request):
    form = SearchForm()
    query = None
    results = []
    if request.method == 'GET':
        if 'query' in request.GET:
            form = SearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['query']
                results = Paper.objects.annotate(
                    search=SearchVector('abstract', 'title'),).filter(search=query)
        serializer = PaperSerializer(results, many=True)

        return Response(serializer.data)

表单代码

class SearchForm(forms.Form):
    query = forms.CharField()

URL配置

path('search/', views.post_search, name='post_search'),
问题分析
  • 参数不匹配:视图中判断的是request.GET中是否存在query字段,但实际请求用的是search=Type,导致条件不成立,不会执行数据库查询,直接返回初始的空列表results。
  • requests调用错误:json.loads()需要传入字符串、字节或字节数组类型,但直接传入requests的Response对象会触发类型错误,应该先获取响应的文本或直接调用Response的json()方法。
解决方案
  1. 修正请求参数或字段名称
    两种可选方案:

    • 修改请求URL为http://127.0.0.1:8000/api/search/?query=Type,保持视图和表单的字段名不变。
    • 统一字段名为search:
      • 修改表单代码:
        class SearchForm(forms.Form):
            search = forms.CharField()
        
      • 修改视图中对应的判断和取值逻辑:
        if 'search' in request.GET:
            form = SearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['search']
                # 后续查询逻辑不变
        
  2. 修正requests调用方式
    不要直接将Response对象传入json.loads(),改用以下方式:

    import requests
    import json
    
    response = requests.get('http://127.0.0.1:8000/api/search/?query=Type')
    # 方式一:直接调用response的json()方法
    data = response.json()
    # 方式二:先获取响应文本再解析
    data = json.loads(response.text)
    

内容的提问来源于stack exchange,提问作者chez93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:10:30