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

DRF报错:'User'对象无法JSON序列化,求解决方案

解决DRF "Object of type 'User' is not JSON serializable" 错误

你遇到这个报错的核心原因很直接:你直接把Django的User模型实例传给了Response,但DRF没法直接将原始模型对象转换成JSON格式——必须通过你定义的序列化器来完成这个转换工作。

下面给你两种解决方案,优先推荐第一种,更符合DRF的设计规范:

方案1:重写get_object(最简洁,推荐)

RetrieveAPIView本身就是用来获取单条资源的,你只需要告诉它要返回当前登录用户就行,完全不需要自己重写整个get方法逻辑:

from .serializers import UserSerializer
from rest_framework.views import RetrieveAPIView
from rest_framework import permissions
from django.contrib.auth.models import User

class UserDetailsView(RetrieveAPIView):
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer

    def get_object(self):
        # 直接返回当前登录用户,无需额外查询数据库
        return self.request.user

这样DRF会自动调用你的UserSerializer来序列化当前用户对象,然后返回标准的JSON响应。

方案2:如果你一定要重写get方法

要是你坚持要自定义get方法的逻辑,记得必须用序列化器处理User对象,再返回序列化后的结构化数据:

from .serializers import UserSerializer
from rest_framework.views import RetrieveAPIView
from rest_framework import permissions
from rest_framework.response import Response
from django.contrib.auth.models import User

class UserDetailsView(RetrieveAPIView):
    model = User
    queryset = User.objects.all()
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer

    def get(self, request, *args, **kwargs):
        # 直接使用request.user即可,无需重复查询数据库,属于冗余操作
        user = request.user
        # 用序列化器处理用户对象,转换为可序列化的格式
        serializer = self.get_serializer(user)
        # 返回序列化后的字典数据,而非原始模型实例
        return Response(serializer.data)

额外小提醒

你之前代码里的User.objects.get(id=request.user.id)完全没必要——request.user已经是当前登录的用户对象了,再查一次数据库纯粹是浪费性能,直接用request.user就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:30:35