Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 减少从django模板启动的数据库查询数量_Mysql_Django_Django Templates_Django Queryset - Fatal编程技术网

Mysql 减少从django模板启动的数据库查询数量

Mysql 减少从django模板启动的数据库查询数量,mysql,django,django-templates,django-queryset,Mysql,Django,Django Templates,Django Queryset,我的项目有一个自定义权限模型,我没有使用django的默认权限后端。我有一个自定义has_权限模板标记,用于检查用户是否具有指定的权限 问题是每次都有很多查询针对相同的检查,我正在寻找一种方法来减少我的权限查询。我在模板中所做的是: {% if user|has_permission:'jpermission.can_edit_jpermission' or user|has_permission:'jgroup.can_edit_jgroup' or

我的项目有一个自定义权限模型,我没有使用django的默认权限后端。我有一个自定义has_权限模板标记,用于检查用户是否具有指定的权限

问题是每次都有很多查询针对相同的检查,我正在寻找一种方法来减少我的权限查询。我在模板中所做的是:

    {% if user|has_permission:'jpermission.can_edit_jpermission' or 
          user|has_permission:'jgroup.can_edit_jgroup' or 
          user|has_permission:'role.can_edit_role' %}
has_权限模板标签的代码如下:

rep = perm_name.split('.') # rep is for e.g. "jpermission.can_edit_jpermission"
ctn_type = rep[0]
codename = rep[1]

pr = JPermission.objects.filter(model_name=ctn_type, codename=codename)
if pr.exists():
    if user.has_perm(pr[0]):
        return True
具体来说,问题是每次我检查完全相同的if语句时,都会产生大量的查询(从我正在做的事情来看,很明显会有)

我还有别的办法吗?像一次查询所有权限一样,缓存它们,并执行类似于如何处理与预取相关的操作,以禁止进一步的db查询(使用循环和…)的python过滤


注意:
has_perm
也被覆盖,并检查用户
角色
权限
是否具有指定的权限)

有多种解决方案

  • 将权限作为模型的方法移动到用户模型,并使用decorator,以便对方法的连续调用不会再次命中数据库
  • 用户登录时将权限状态存储在会话中,稍后使用会话数据检查权限
看起来您正在使用django guardian,它已经:

一旦检查了单个对象,就会存储权限,而我们不会 如果对此对象调用了另一个检查,请再次点击数据库。这是 非常适合模板、视图或其他基于请求的检查(假设我们 在获取所有权限时,对单个对象没有数百个权限 选中对象的权限)


用户更改/更新这些权限的频率如何?在会话中存储权限是否安全?