Какой самый питонический способ проверить, имеет ли obj какое-либо разрешение из списка

Как в Django, так и в Django Guardian очень просто проверить, есть ли у пользователя разрешение:

user.has_perm('app.can_eat_pizzas')

Также легко проверить, имеет ли он все разрешения:

user.has_perms(('app.add_student', 'app.can_deliver_pizzas'))

Каким наиболее питоническим способом можно проверить, имеет ли пользователь любое разрешение?

Я знаю, что могу просто составить цепочку операторов if/or, но это кажется громоздким:

if user.has_perm('app.add_student') or user.has_perm('app.can_deliver_pizzas')

Вы можете получить все разрешения пользователя, используя user.user_permissions.all() или вместе с user.user_permissions.all().count(), проверяя длину объектов разрешений, если длина больше 0.

Есть другой способ проверить, есть ли у пользователя права в списке user.user_permissions.filter(pk__in=<list>)

perms = Permission.objects.filter(pk__in=list)
perms.user.all()

Либо вы можете получить пользователей на основе разрешений, либо отфильтровать список по разрешениям.

Надеюсь, это может помочь вам

Я бы сделал что-то вроде:

if any(user.has_perm(perm_name) for perm_name in permission_list):
    # rest of code

(Использование generator внутри any() имеет дополнительное преимущество - прекращение проверки элементов списка после первой оценки True)

Вернуться на верх