Django guardian中如何查询授予用户对象实例权限的用户组
解决方案
你可以通过自定义用户模型方法实现需求,核心逻辑是筛选用户所属的所有组中,持有指定对象权限的组即可,以下是可直接复用的实现:
基础实现(兼容性强)
先导入依赖的工具方法:
from django.contrib.auth import get_user_model from guardian.shortcuts import get_group_perms, get_perm_codename
给用户模型添加自定义查询方法:
def has_perm_from_groups(self, perm, obj=None): # 解析权限的标准 codename perm_codename = get_perm_codename(perm, obj) # 遍历用户所属所有组,筛选持有对应权限的组 return [ group for group in self.groups.all() if perm_codename in get_group_perms(group, obj) ] # 绑定方法到用户模型,自定义用户模型可直接把方法写在模型类中 User = get_user_model() User.add_to_class('has_perm_from_groups', has_perm_from_groups)
调用效果
和你预期的使用方式完全一致:
>>> joe.has_perm_from_groups('sites.change_site', site) [<Group: site_owners_group>]
高性能实现(适合用户组数量多的场景)
如果你的系统中用户所属组数量较多,可以直接操作guardian的权限表实现单SQL查询,避免循环查询开销:
from guardian.models import GroupObjectPermission from guardian.utils import get_identity def has_perm_from_groups(self, perm, obj): perm_content_type, perm_codename = get_identity(perm) # 直接过滤权限关联的用户组 group_perms = GroupObjectPermission.objects.filter( permission__codename=perm_codename, permission__content_type=perm_content_type, group__in=self.groups.all(), object_pk=obj.pk ).select_related('group') return [perm.group for perm in group_perms]
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

