Django ORM access optimization with Filter

Viewed 180

I've implemented a method on my django app that will check if a user has a specific permission or it's part of a group that contains this specific permission.

def user_has_perm(user, *permissions_to_check):
        permission_check = True
        permissions_not_found = []

        user_groups = user.groups.all().prefetch_related('permissions')

        for permission in permissions_to_check:
            content_type, permission_codename = permission.split('.')
            if not user.has_perm(permission) and not user_groups.filter(
                    permissions__content_type__model__icontains=content_type,
                    permissions__codename__icontains=permission_codename).exists():  # Goes down from Groups to the single user permission
                permission_check = False
                permissions_not_found.append(permission)

        return permission_check, permissions_not_found

Now, everythings works like a charm, but, Django-Debug-Toolbar it's complaining about the query, that it's duplicated many times as the groups to check.

For me it's a bottleneck, because some users will have 50 groups associated, and really i don't know how to optimize this query...

Any suggestions?

Thanks

1 Answers
Related