Django应用如何获取用户实例?访问个人页报AnonymousUser无data属性错误
Django个人资料接口错误修复方案
错误原因
你的代码存在两个核心问题导致报错:
- 执行顺序错误:你在判断用户登录状态之前就执行了序列化操作,未登录时
request.user是AnonymousUser对象,传入序列化器后直接触发异常,根本不会执行后续的登录校验逻辑 - 序列化器入参不匹配:
user_profile_serializer绑定的模型是Profile,你传入的request.user是Django自带的User模型实例,类型不匹配,就算用户处于登录状态也无法得到正确结果
修复步骤
1. 重写视图逻辑
直接使用DRF自带的权限类做登录校验,同时查询当前登录用户关联的Profile实例传入序列化器:
from rest_framework import generics, status from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from .models import Profile from .serializers import user_profile_serializer class user_profile(generics.GenericAPIView): serializer_class = user_profile_serializer # 内置权限校验,未登录用户访问直接返回401,无需手动判断登录状态 permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): # 获取当前用户对应的Profile实例,不存在则自动创建,避免匹配不到记录报错 user_profile_instance, _ = Profile.objects.get_or_create(user=request.user) serialized_profile = self.get_serializer(user_profile_instance).data return Response(serialized_profile, status=status.HTTP_200_OK)
2. 可选优化(建议调整)
你当前Profile模型的user字段配置存在不合理项:OneToOneField设置default=""不符合外键字段的约束规则,建议删除default=""参数,配合get_or_create或者用户创建时触发信号自动生成关联Profile实例即可。
内容的提问来源于stack exchange,提问作者C-Bizz
相关产品推荐
相关产品推荐

