关于Django中user_permissions与get_user_permissions()的正确用法咨询
关于Django用户权限相关方法与表的澄清
我来帮你理清这些概念,其实你遇到的情况都是Django权限系统的正常设计,咱们一步步拆解:
1. get_user_permissions()、get_group_permissions()与has_perm()的核心区别
你例子里的现象完全符合预期,这三个方法的职责是明确分开的:
get_user_permissions():只返回直接分配给用户本人的权限,和user_permissions表完全对应。默认它返回的是权限字符串的集合(比如{'app.view_model'}),如果传入queryset=True参数,才会返回Permission对象的QuerySet,和u.user_permissions.all()结果一致。get_group_permissions():只返回用户所属组拥有的权限,同样默认返回字符串集合,queryset=True时返回QuerySet。has_perm():会同时检查用户直接权限 + 用户所属组的权限,只要其中一个渠道拥有目标权限,就返回True。所以你例子里用户u虽然没有直接权限,但组g有,所以has_perm返回True,但get_user_permissions()还是空集合。
2. user_permissions表的具体用途
这个表是用户和权限的中间关联表,专门用来存储单独分配给某个用户的特殊权限,和组权限是完全独立的场景:
- 比如你有个普通用户,需要临时拥有某个模块的编辑权限,但又不想把他加到编辑组(避免组权限带来的其他关联权限),这时候就可以直接把编辑权限添加到他的
user_permissions中,不用修改组配置。 - 它的核心作用就是给用户“开小灶”,实现精细化的权限控制,弥补组权限批量分配不够灵活的问题。
3. 管理用户直接权限的内置方法
其实Django提供了内置的方法来操作用户直接权限,只是需要结合user_permissions属性来使用:
- 添加直接权限:先获取对应的
Permission对象,然后用add()方法添加:from django.contrib.auth.models import Permission # 获取目标权限 perm = Permission.objects.get(codename='view_model', content_type__app_label='app') # 给用户添加该权限 u.user_permissions.add(perm) # 也可以一次性添加多个权限 # u.user_permissions.add(perm1, perm2) - 撤销直接权限:用
remove()方法删除单个权限,或者clear()清空所有直接权限:# 移除单个权限 u.user_permissions.remove(perm) # 清空用户所有直接权限 u.user_permissions.clear() - 检查用户是否拥有某个直接权限:如果要单独检查直接权限(不包含组权限),可以这样做:
# 方法1:检查权限字符串是否在get_user_permissions返回的集合中 'app.view_model' in u.get_user_permissions() # 方法2:通过QuerySet直接判断 Permission.objects.filter(user=u, codename='view_model', content_type__app_label='app').exists()
内容的提问来源于stack exchange,提问作者Will Meyers
相关产品推荐
相关产品推荐

