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

DRF中IsOwnerUserOrReadOnly用户所有者权限不生效问题

问题根因

两个权限类的判断逻辑表面结构一致,实际对比的数据类型不匹配,导致判断永远不成立:

  • 正常工作的IsOwnerApartmentOrReadOnly中,obj.seller是Apartment模型关联User的外键字段,取值为对应的User模型实例,和request.user(当前登录用户的User实例)做相等校验时,同主键的用户实例会判定为匹配,因此逻辑正常。
  • 失效的IsOwnerUserOrReadOnly中,obj.username是User模型存储用户名字符串的字段,你拿字符串类型的用户名直接和request.user这个User类实例做==判断,两边数据类型完全不同,判断结果永远为False,因此权限校验始终无法通过。

相关运行效果参考:
运行效果1
运行效果2

修复方案

调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:39:17