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
相关产品推荐
相关产品推荐

