2010-07-14 60 views
1

當使用的外殼,這讓我感到困惑(權限沒有反映更改):理解行爲保存

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

爲什麼用戶對象不保存更新?
有沒有辦法保存和更新對象?

回答

0

發生這種情況是因爲用戶與Permission有許多關係,因此當您執行user.user_permissions.add(p)時,「auth_user」表不會更新。相反,它的關係「通過」表(「auth_user_user_permissions」)得到更新。實際上,您根本不需要撥打user.save()

get_all_permissions()方法似乎使用緩存的數據,所以如果你想要的最新變化,使用:

user.user_permissions.all() 

注意這將返回許可對象的列表,所以如果你想代號列表在完全一樣的格式爲get_all_permissions()調用(不知道你爲什麼會雖然),你可以這樣做:

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

當磁盤上的對象改變時,Django不會更新內存中的對象。您的第一個用戶仍然看起來像從磁盤讀取時一樣。

+0

這樣解釋發生了什麼,但不是真的,爲什麼?或通過磁盤上更改更新內存中對象的最佳方式? – Doug 2010-07-16 13:17:00

+0

您給出的例子是一種特殊情況,因爲'get_all_permissions()'方法是'User'模型特定的方法,恰好使用緩存。如果你使用更通用的Django模型方法/屬性,你會發現它們的行爲更直觀,並且會在你期望的時候更新。 – 2010-07-16 13:45:05