Django REST Framework中CustomUser详情接口请求报错排查
问题分析与解决方案
问题根源
你给CustomUserViewSet配置的IsAuthorOrReadOnly权限类是为文章(Post)这类包含author字段的模型设计的——它默认被检查的对象(obj)存在author属性。但CustomUser本身就是用户模型,根本没有author字段,所以访问单用户详情接口时,权限检查会抛出AttributeError。
默认User模型的单用户接口能正常运行,大概率是因为你给它配置的权限类不是IsAuthorOrReadOnly,所以没有触发这个错误。
解决方案
你需要给CustomUserViewSet使用适合用户模型的权限类,比如自定义一个仅允许用户自身修改信息、其他人只读的权限:
1. 定义适合用户模型的权限类
在api/permissions.py中添加:
from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): """仅允许对象所有者进行修改操作,其他用户仅能查看""" def has_object_permission(self, request, view, obj): # GET、HEAD、OPTIONS 这类安全方法允许所有已认证用户访问 if request.method in permissions.SAFE_METHODS: return True # 非安全方法(PUT/PATCH/DELETE)仅允许用户操作自己的账户 return obj == request.user
2. 更新CustomUserViewSet的权限配置
修改CustomUserViewSet代码,替换权限类:
from rest_framework import viewsets from users.models import CustomUser from .serializers import CustomUserSerializer from .permissions import IsOwnerOrReadOnly # 换成新的权限类 class CustomUserViewSet(viewsets.ModelViewSet): """Viewset for Custom User Object.""" queryset = CustomUser.objects.all() serializer_class = CustomUserSerializer permission_classes = (IsOwnerOrReadOnly,) # 更新这里
这样配置后:
- 所有已认证用户都能查看任意用户的详情(和你默认User接口的行为一致)
- 只有用户自己能修改/删除自己的账户信息,符合合理的权限逻辑
如果你的需求是所有用户都能查看用户列表和详情,仅管理员能修改,也可以直接使用DRF内置的IsAuthenticatedOrReadOnly或IsAdminUser权限类,根据实际需求调整即可。
内容的提问来源于stack exchange,提问作者Uchenna Adubasim
相关产品推荐
相关产品推荐

