了解django模型的行为保存

时间:2010-07-14 19:36:22

标签: python django

使用shell时,这让我很困惑(权限没有反映出变化):

>>> user = User.objects.get(username='test')
>>> user.get_all_permissions()
set([])
>>> p = Permission.objects.get(codename="add_slide")
>>> user.user_permissions.add(p)
>>> user.save()
>>> user.get_all_permissions()
set([])
>>> user = User.objects.get(username='test')
>>> user.get_all_permissions()
set([u'slides.add_slide'])

为什么用户对象在保存时不会更新?
有没有办法保存和更新对象?

2 个答案:

答案 0 :(得分:2)

当磁盘上的对象发生变化时,Django不会更新内存中的对象。您的第一个用户看起来仍然像从磁盘读取时那样。

答案 1 :(得分:0)

这种情况正在发生,因为User与Permission有很多关系,因此当您执行user.user_permissions.add(p)时,“auth_user”表不会更新。相反,它的关系(“auth_user_user_permissions”)的“通过”表得到更新。实际上,您根本不需要致电user.save()

get_all_permissions()方法似乎使用缓存数据,因此如果您想要进行最新更改,请使用:

user.user_permissions.all()

请注意,这将返回一个Permission对象列表,因此如果您想要一个与get_all_permissions()调用格式完全相同的代码列表(不知道为什么会这样),您可以这样做:< / p>

set(user.user_permissions.values_list('codename', flat=True))