在以下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'])
答案 0 :(得分:0)
Django在您第一次为给定用户实例请求权限时执行权限缓存,它将_perm_cache
存储在用户对象上,这是为了防止在检查权限时过多的数据库查找,这可能会在请求(特别是在模板渲染期间,您可能需要对表单和链接进行权限检查)。
您已经确定了一个问题的解决方案,即从数据库重新加载用户。另一种是从用户对象中删除_perm_cache
(和_group_perm_cache
,如果你想彻底):
del john._perm_cache
del john._group_perm_cache