В Django guardian как определить, какая группа предоставила пользователю права доступа к экземпляру объекта?

Я пытаюсь установить разрешения на уровне объекта, используя Django guardian и группы; где я даю разрешения группам - не пользователям - и добавляю/удаляю пользователей из групп по мере необходимости.

Когда пользователь имеет разрешение на взаимодействие с экземпляром объекта - потому что он входит в группу, имеющую необходимые разрешения - как я могу определить, какая из групп пользователя дала ему это разрешение?

В качестве примера, основываясь на примере в django-guardian-docs, в идеале должно быть что-то вроде:

>>> joe.has_perm_from_groups('sites.change_site', site)
[site_owners_group]

Django guardian имеет ярлык под названием get_groups_with_perms(obj), который Returns queryset of all Group objects with any object permissions for the given obj. https://django-guardian.readthedocs.io/en/stable/api/guardian.shortcuts.html#get-groups-with-perms

В Django есть метод queryset под названием intersection, который returns the shared elements of two or more QuerySets https://docs.djangoproject.com/en/3.2/ref/models/querysets/#intersection

Используя эти две функции, я могу найти группы, в которых состоит пользователь и которые также имеют разрешения на объект. Затем я использую цикл for для определения группы с разрешением. Если разрешение есть у двух групп, я не знаю, как выяснить, какая из них дала пользователю разрешение, поэтому возвращается первая найденная группа

# Find the union of groups
groups = user.groups.all().intersection(get_groups_with_perms(obj))

# Check if any group has the permission, and return if True
for group in groups:
    if 'change_site' in get_perms(group, obj):
        return group
return None
Вернуться на верх