Django APIView实现推荐系统遇JSON序列化错误求助
解决Django API中TypeError: Object of type User is not JSON serializable问题
核心问题分析
- Session存储User对象导致序列化失败:你在
request.session["ref_profile"] = profile.user中直接将User模型对象存入session,但session数据需要序列化为JSON格式存储,User对象无法直接被JSON序列化。 - 异常处理不严谨:空的
except块会捕获所有异常,且后续return Response(f"{profile.user.username}")在ReferralSys不存在时会触发NameError(因为profile未被定义)。
修正后的代码
views.py
from rest_framework.views import APIView from rest_framework.response import Response from .models import ReferralSys class MainView(APIView): def post(self, request): code = request.data.get("ref_code") if not code: return Response({"error": "缺少ref_code参数"}, status=400) try: profile = ReferralSys.objects.get(code=code) # 存储用户ID而非User对象到session request.session["ref_profile"] = profile.user.id username = profile.user.username return Response({"referrer": username}) except ReferralSys.DoesNotExist: # 捕获具体的不存在异常,而非所有异常 return Response({"error": "无效的推荐码"}, status=404)
关键修复点
- Session存储优化:将
profile.user改为profile.user.id,ID是整数,可直接被JSON序列化,后续如果需要获取用户对象,可通过User.objects.get(id=request.session.get("ref_profile"))获取。 - 异常处理改进:替换空
except为except ReferralSys.DoesNotExist,精准捕获推荐码不存在的情况,同时避免未定义变量的错误。 - 参数校验:增加
code参数的存在性校验,提前返回错误,避免后续逻辑出错。 - 返回格式统一:改用字典格式返回响应,更符合REST API的规范,而非直接返回字符串。
额外建议
- 清理未使用的导入(比如
json, requests, HttpResponse, serializers等),保持代码整洁。 - 可以考虑使用Django REST Framework的序列化器(Serializer)来处理模型对象的序列化,后续扩展功能时更灵活。
内容的提问来源于stack exchange,提问作者Pau1aAm7
相关产品推荐
相关产品推荐

