2013-03-16 54 views
0

在下面的Django manage.py shell会话中,为什么我没有看到我添加到我的用户对象的权限,直到我为该用户执行新的查询?添加权限后,为什么需要重新查询Django用户才能看到添加的权限?

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

Django的不许可你第一次要求他们对给定用户实例,它存储了他们对_perm_cache用户对象上的缓存,这是为了防止过多的数据库查询检查过程中可能发生的无数次权限时请求(特别是在模板呈现过程中,您可能会对表单和链接进行权限检查)。

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

del john._perm_cache 
del john._group_perm_cache 
+0

优秀的详细原因和解决方案 - 感谢安德鲁! – 2013-03-16 03:14:37

相关问题