2015-10-05 57 views
0

我有一個Django應用程序這個看似簡單的測試情況下,失敗:爲什麼我的django模型沒有保存?

def test_matches(self): 
    # setup code... 

    matches = tournament.match_set.order_by('match_id') 

    matches[0].winner = 'a' 
    matches[0].save() 
    self.assertEqual(matches[0].winner, 'a') 

什麼問題?

回答

4

的問題是,matches不是簡單的列表,而是一個QuerySet:索引和切片一個QuerySet訪問數據庫,所以每個matches[0]返回一個新的比賽。因此保存未修改的對象。

由於@Wtower指出,相關的文檔中發現here

這應該是書面的方式是這樣的:

m = matches[0] 
    m.winner = 'a' 
    m.save() 
    self.assertEqual(matches[0].winner, 'a') 

交替時,QuerySet力評估,如果這就是你想要什麼:

matches = list(tournament.match_set.order_by('match_id')) 

或更好,如果您能識別數據庫中的匹配:

matches.filter(match_id=0).update(winner=0) 

這種方式是更短,不更新就地沒有加載數據到python,從而消除了可能的競爭條件。但是,過濾match_id(通常)與索引到QuerySet不同。 (切片QuerySet類似matches[0:1]無法更新)

+1

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#when-querysets-are-evaluated – Wtower

相關問題