加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读