Создание массового получения разрешений для django user.has_perms для повышения скорости работы кода
У меня есть такая функция, которая выполняется для нескольких projects
и users
:
def has_project_permissions(project, user, can_edit=False, is_owner=False):
permission_level = CAN_VIEW
if can_edit:
permission_level = CAN_EDIT
if is_owner:
permission_level = IS_OWNER
return user.has_perm(permission_level, project) or (user.is_staff and not project.disable_staff_access)
В настоящее время я использую for loop
для итерации каждого пользователя и каждого проекта и получения разрешений. Есть ли способ переписать его и получить все разрешения для всех пользователей и проектов в Django
? Мне это нужно для повышения скорости, так как когда пользователей и проектов слишком много, очевидно, что скорость будет очень плохой. Я бы ожидал, что это возможно в Django
каким-то образом.
Вот функция, в которой я выполняю итерацию над projects
. Итерация над пользователями происходит на один уровень выше (не включена):
def _get_json_for_user(projects, user):
"""Returns JSON representation of the given User object
Args:
user (object): Django user model
Returns:
dict: json object
"""
if hasattr(user, '_wrapped'):
user = user._wrapped # Django request.user actually stores the Django User objects in a ._wrapped attribute
user_json = {_to_camel_case(field): getattr(user, field) for field in
['username', 'email', 'first_name', 'last_name', 'last_login', 'is_staff', 'date_joined', 'id']}
user_json['displayName'] = user.get_full_name()
csi_user = True
if user:
if len(projects) == 0:
csi_user = False
else:
for project in projects:
if not has_project_permissions(project, user):
csi_user = False
break
user_json['csiUser'] = csi_user
return user_json