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

Django DRF UserViewSet配置lookup_field=username后更新查询功能失效

问题根因
  • 自定义的update方法硬编码序列化实例为request.user,未读取URL路径中传递的username参数对应的用户对象,因此无论URL中传入任意值,最终操作的都是当前登录用户。
  • 现有retrieve方法为冗余代码,和父类RetrieveModelMixin的默认实现逻辑完全一致。
修复方案
  1. 修改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)
  1. (可选)删除冗余的retrieve方法,直接使用父类默认实现即可。
  2. 确认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:45:00