python – 使用Filter的Django ORM访问优化
发布时间:2020-12-20 13:17:51 所属栏目:Python 来源:网络整理
导读:我已经在我的 django应用程序上实现了一个方法,该方法将检查用户是否具有特定权限,或者它是包含此特定权限的组的一部分. def user_has_perm(user,*permissions_to_check): permission_check = True permissions_not_found = [] user_groups = user.groups.al
我已经在我的
django应用程序上实现了一个方法,该方法将检查用户是否具有特定权限,或者它是包含此特定权限的组的一部分.
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 现在,Everythings就像一个魅力,但是,Django-Debug-Toolbar它正在抱怨这个查询,它被重复多次作为要检查的组. 对我来说这是一个瓶颈,因为有些用户会关联50个组,而且我真的不知道如何优化这个查询…… 有什么建议? 谢谢 解决方法
正如克劳斯所说,这是一个数据库杀手.如果有很多权限(即使没有你自己的任何应用程序,也会有很多权限),你可能会发现自己在user_has_perm函数中执行了数百个查询.你可以通过缓存减少它
from django.core.cache import cache. def user_has_perm(user,*permissions_to_check): hash = # create a hash from user.id and permissions_to_check. # maybe something as simple as "".join(permissions_to_check) perms = cache.get(hash) if perms: return perms 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) cache.set(hash,[permisson_check,permissions_not_found],10**5) return permission_check,permissions_not_found (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |