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

Django关联查询:如何获取指定用户的所有权限?

获取指定用户的所有权限(Django ORM实现)

嘿,我来帮你用Django ORM实现你要的查询逻辑!根据你给出的模型结构,有几种简洁的方式可以达成目标,下面是最常用的两种:

方法1:直接通过关联过滤(最贴近你的SQL逻辑)

利用Django ORM的双下划线关联查询,直接从RolePriviledge出发,通过关联表反向定位到目标用户:

from django.contrib.auth.models import User

# 替换成你要查询的用户ID
target_user_id = 123

# 获取该用户的所有权限
user_privileges = RolePriviledge.objects.filter(
    role__userrole__user_id=target_user_id
).distinct()

说明:

  • role__userrole__user_id 是Django ORM的关联语法,等价于SQL中的JOIN操作:RolePriviledge.role → Role.id,再Role.id → UserRole.role_id,最后匹配UserRole.user_id
  • 添加distinct()是为了避免因用户拥有多个角色而出现重复的权限记录(如果不需要去重可以去掉)
  • 执行这个查询时,Django生成的SQL和你给出的几乎一致,只是表名会带上你的app前缀

方法2:从用户对象出发反向查询

如果你已经拿到了用户实例,也可以从User对象开始反向关联查询:

# 先获取目标用户实例
target_user = User.objects.get(id=target_user_id)

# 通过用户的关联角色,过滤出对应的权限
user_privileges = RolePriviledge.objects.filter(
    role__in=target_user.userrole_set.values('role')
)

说明:

  • target_user.userrole_set是Django自动生成的反向关联管理器(因为UserRole的user字段是ForeignKey,默认反向名称为模型名_set)
  • role__in用来匹配所有属于该用户角色的权限

两种方法最终都会返回RolePriviledge对象的QuerySet,你可以直接遍历获取每一条权限的module_name和priviledge_level等字段。

内容的提问来源于stack exchange,提问作者user3628119

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:19:26