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()方法。
解决方案
修正请求参数或字段名称
两种可选方案:- 修改请求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'] # 后续查询逻辑不变
- 修改表单代码:
- 修改请求URL为
修正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
相关产品推荐
相关产品推荐

