Django DRF UserViewSet配置lookup_field=username后更新查询功能失效
问题根因
- 自定义的
update方法硬编码序列化实例为request.user,未读取URL路径中传递的username参数对应的用户对象,因此无论URL中传入任意值,最终操作的都是当前登录用户。 - 现有
retrieve方法为冗余代码,和父类RetrieveModelMixin的默认实现逻辑完全一致。
修复方案
- 修改
update方法,先调用父类的get_object()方法获取URL对应用户名的用户对象,再进行序列化更新:
def update(self, request, *args, **kwargs): # 获取URL路径中username对应的用户对象 user = self.get_object() serializer = UserModelSerializer(user, data=request.data, partial=True) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_200_OK)
- (可选)删除冗余的
retrieve方法,直接使用父类默认实现即可。 - 确认
IsSameUser权限类的逻辑正确,需校验操作对象和当前登录用户一致,避免越权操作:
from rest_framework import permissions class IsSameUser(permissions.BasePermission): def has_object_permission(self, request, view, obj): return obj == request.user
修复后,当URL中传入的用户名对应用户和当前登录用户不一致时,IsSameUser权限会直接拦截请求返回403,符合预期逻辑。
内容的提问来源于stack exchange,提问作者Risker
相关产品推荐
相关产品推荐

