【发布时间】:2014-07-31 11:54:06
【问题描述】:
我的项目有一个自定义权限模型,并且我没有使用 django 的默认权限后端。我有一个自定义 has_permission 模板标签来检查用户是否具有指定的权限。
问题是每次都会针对相同的检查进行大量查询,我正在寻找一种方法来减少我的权限查询。我在模板中所做的就像:
{% 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_permission 模板标签的代码如下:
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 语句时,都会进行大量查询(从我正在做的事情来看,很明显会有)。
还有其他方法可以解决吗?像查询所有权限一次,缓存它们,并执行类似 prefetch_related 的处理方式以禁止进一步的数据库查询(python 使用循环和...进行过滤)?
P.S:has_perm 也被覆盖,并检查用户 role、group 或 permissions 是否具有指定的权限)
【问题讨论】:
-
这些权限多久会为用户更改/更新一次?
标签: mysql django django-templates django-queryset