Mysql 减少从django模板启动的数据库查询数量
我的项目有一个自定义权限模型,我没有使用django的默认权限后端。我有一个自定义has_权限模板标记,用于检查用户是否具有指定的权限 问题是每次都有很多查询针对相同的检查,我正在寻找一种方法来减少我的权限查询。我在模板中所做的是: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
{% 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,以便对方法的连续调用不会再次命中数据库
- 用户登录时将权限状态存储在会话中,稍后使用会话数据检查权限
用户更改/更新这些权限的频率如何?在会话中存储权限是否安全?