我尝试使用Django rest framework
构建API我得到了
的对象type 'TypeError' is not JSON serializable
我该怎么办?
这是我的view.py
class NewsViewSet(viewsets.ModelViewSet):
queryset = News.objects.all()
serializer_class = NewsSerializer
def list(self, request, **kwargs):
try:
nba = query_nba_by_args(**request.query_params)
serializer = NewsSerializer(nba['items'], many=True)
result = dict()
result['data'] = serializer.data
result['draw'] = nba['draw']
result['recordsTotal'] = nba['total']
result['recordsFiltered'] = nba['count']
return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)
except Exception as e:
return Response(e, status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)
答案 0 :(得分:2)
Django无法将Exception对象转换为JSON格式并引发错误。要修复它,您应该将错误转换为字符串并将结果传递给响应:
except Exception as e:
return Response(str(e), status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)
答案 1 :(得分:0)
如下所示更改您的观点,
class NewsViewSet(viewsets.ModelViewSet):
queryset = News.objects.all()
serializer_class = NewsSerializer
def list(self, request, **kwargs):
try:
nba = query_nba_by_args(**request.query_params)
serializer = NewsSerializer(nba['items'], many=True)
result = dict()
result['data'] = serializer.data
result['draw'] = nba['draw'] if "draw" in nba else None
result['recordsTotal'] = nba['total'] if "total" in nba else None
result['recordsFiltered'] = nba['count'] if "count" in nba else None
return Response(result, status=status.HTTP_200_OK)
except Exception as e:
return Response(str(e), status=status.HTTP_404_NOT_FOUND)
答案 2 :(得分:0)
首先
import json
from django.http import HttpResponse
更改行
return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)
这个
return HttpResponse(json.dumps(result),content_type="application/json")
或使用
from django.http import JsonResponse
return JsonResponse(json.dumps(result))
答案 3 :(得分:0)
Python 异常不是 json 可序列化的。
由于某些连接或内容不可用问题,它在 try
中失败,然后进入 except
块,在那里您将异常 e
原样传递给 Response()
,从而创建问题。解决方案 - 检查 URL 并在 except 块中将异常 e
转换为字符串并传递给 Response(str(e), status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)
。