DRF中IsOwnerUserOrReadOnly用户所有者权限不生效问题
问题根因
两个权限类的判断逻辑表面结构一致,实际对比的数据类型不匹配,导致判断永远不成立:
- 正常工作的
IsOwnerApartmentOrReadOnly中,obj.seller是Apartment模型关联User的外键字段,取值为对应的User模型实例,和request.user(当前登录用户的User实例)做相等校验时,同主键的用户实例会判定为匹配,因此逻辑正常。 - 失效的
IsOwnerUserOrReadOnly中,obj.username是User模型存储用户名字符串的字段,你拿字符串类型的用户名直接和request.user这个User类实例做==判断,两边数据类型完全不同,判断结果永远为False,因此权限校验始终无法通过。
相关运行效果参考:

修复方案
调整IsOwnerUserOrReadOnly的判断逻辑,直接对比两个User实例即可,修改permissions.py对应代码:
class IsOwnerUserOrReadOnly(permissions.BasePermission): def has_object_permission(self, request, view, obj): if request.method in permissions.SAFE_METHODS: return True # 直接匹配当前访问的用户对象和登录用户对象 return obj == request.user
如果偏好字段级对比,也可以写成对比主键值,效果完全一致:
return obj.id == request.user.id
补充说明
你当前views.py中的权限类配置顺序、视图集逻辑没有问题,修正上述类型匹配问题后,用户账号所有者的编辑权限即可正常生效,和公寓所有者权限的表现一致。
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

