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

Django APIView实现推荐系统遇JSON序列化错误求助

解决Django API中TypeError: Object of type User is not JSON serializable问题

核心问题分析

  1. Session存储User对象导致序列化失败:你在request.session["ref_profile"] = profile.user中直接将User模型对象存入session,但session数据需要序列化为JSON格式存储,User对象无法直接被JSON序列化。
  2. 异常处理不严谨:空的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:45:34