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

添加权限后,为什么需要重新查询Django用户以查看添加的权限?,django,permissions,Django,Permissions,在下面的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

在下面的
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'])
[16]中的
:john=User.objects.create\u User(username='john')
在[17]中:约翰
出[17]:
在[18]中:john.get_all_permissions()
Out[18]:设置([])
在[19]中:john.user\u permissions.add(Permission.objects.get(codename='add\u user'))
在[20]中:john.get\u all\u permissions()

Out[20]:set([])Django在您第一次为给定的用户实例请求权限时缓存权限,它将权限存储在用户对象上的
\u perm\u cache
上,这是为了防止在检查权限时过度查找数据库,而在请求过程中可能会多次出现这种情况(特别是在模板呈现期间,您可能会对表单和链接进行权限检查)

您已经确定了问题的一个解决方案,即从数据库重新加载用户。另一个解决方案是从用户对象中删除
\u perm\u cache
(以及
\u group\u perm\u cache
,如果您想彻底删除):

del john._perm_cache
del john._group_perm_cache