0

在接下来的Django manage.pyshell 会话中,为什么我在为该用户执行新查询之前看不到我添加到用户对象的权限?

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'])
4

1 回答 1

0

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

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

del john._perm_cache
del john._group_perm_cache
于 2013-03-16T01:02:37.263 回答