Возвращение пользователя вместо True или False в классе разрешения Django
У меня есть пользовательский класс разрешения, который я импортирую в одно из представлений. В этом классе разрешения я использую return user вместо True или False. Но кажется, что это работает. Но я не очень понимаю почему.
Класс выглядит следующим образом:
class ExamplePermission(BasePermission):
def has_permission(self, request, view):
user = CustomUser.objects.filter(user=request.user).first()
if view.action == 'list':
return user
elif request.method == 'POST' or 'PATCH' or view.action == 'destroy' or 'update':
return user and user.user_type == ADMIN
else:
return False
В приведенном выше классе разрешения я в некоторых местах возвращаю пользователя вместо булевых true или false. В чем смысл возврата пользователя? Как это все еще работает?
Да, это будет работать. Проверьте https://docs.python.org/3/library/stdtypes.html#truth-value-testing. Пока user не будет пустым, он будет возвращать True.
По умолчанию объект считается истинным, если только его класс не определяет либо метод bool(), который возвращает False, либо метод len() который возвращает ноль, когда вызывается вместе с объектом.
Таким образом, даже если объект user НЕ является Boolean, он будет рассматриваться как таковой при выполнении любых логических сравнений.
Фактически, это способ, которым часто проверяют, является ли набор запросов empty:
if some_queryset:
print("There is at least one object in some_queryset")
Хотя, как говорится в документации, метод exists() немного быстрее и лучше, если вам не нужен фактический кверисет, а просто нужно узнать, пуст кверисет или нет.