添加权限后,为什么我需要重新查询Django用户以查看添加的权限?

时间:2013-03-16 00:25:21

标签: django permissions

在以下Django manage.py shell会话中,为什么在为该用户执行新查询之前,我没有看到添加到用户对象的权限?

In [16]: john = User.objects.create_user(username='john')

In [17]: john
Out[17]: <User: john>

In [18]: john.get_all_permissions()
Out[18]: set([])

In [19]: john.user_permissions.add(Permission.objects.get(codename='add_user'))

In [20]: john.get_all_permissions()
Out[20]: set([])   <== I expected to see the new permission here.  Why not?

In [21]: john = User.objects.get(username='john')

In [22]: john.get_all_permissions()
Out[22]: set([u'auth.add_user'])

1 个答案:

答案 0 :(得分:0)

Django在您第一次为给定用户实例请求权限时执行权限缓存,它将_perm_cache存储在用户对象上,这是为了防止在检查权限时过多的数据库查找,这可能会在请求(特别是在模板渲染期间,您可能需要对表单和链接进行权限检查)。

您已经确定了一个问题的解决方案,即从数据库重新加载用户。另一种是从用户对象中删除_perm_cache(和_group_perm_cache,如果你想彻底):

del john._perm_cache
del john._group_perm_cache