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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:18:04