Создание массового получения разрешений для 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
Вернуться на верх