2012-09-25 12 views
0

我通過分配序數到DocumentMemberships,這是一個表示DocumentCollection的交點的模型管理的DocumentsCollection的順序。這裏是一個地方,我這樣做(這是Collection方法中):無法通過指數評價中修改查詢集對象使用Django

memberships = self.membership_set.order_by('document__title', 'document__revision').all() 
for i in range(memberships.count()): 
    if memberships[i].document.category == 'SDS': 
     memberships[i].ordinal = i + 1000 # push documents in the 'SDS' category to the end 
    else: memberships[i].ordinal = i # leave the rest ordered by title and then revision 
    memberships[i].save() 

然而,當我運行此代碼後檢查在管理界面的DocumentMemberships,所有的序數爲零(默認爲那個領域)。

我將問題追溯到QuerySet中的對象被索引訪問時未正確修改。這是一個shell會話更清楚地表明瞭這個問題:

>>> memberships = s.membership_set.order_by('document__title', 'document__revision').all() 
>>> memberships.all() 
[large number of DocumentMembership objects] 
>>> memberships[0] 
[DocumentMembership object] 
>>> memberships[0].ordinal = 2 
>>> memberships[0].ordinal 
0 

的序數必須全部計算爲進一步處理前的整數,所以我不能簡單地迭代它。我錯過了什麼?

回答

2

問題是,當您使用索引從查詢集中獲取對象時,獲取的對象是原始副本,因此您正在修改查詢集「內部」對象的副本。

如果你讓這樣的:

m = memberships[0] 
m is membership[0] 

False結果。

嘗試this。也許這有助於你解決使用查詢集中對象的索引來更新它的屬性的問題。

希望它有幫助!