2011-09-01 40 views
3

我有我的看法如下代碼Django的模型不保存..完全糊塗了這裏

page = get_object_or_404(Page, site = site, slug = slug) 
pagecontents = PageContent.objects.filter(page=page) 
pagecontents[0].description = form.cleaned_data['description'] 
pagecontents[0].save() 
print pagecontents[0].description 
print form.cleaned_data['description'] 

當兩個打印語句執行,我得到以下

爲線print pagecontents[0].description

<p>Most important page</p> 

爲線form.cleaned_data['description']

<p>Least important page</p> 

爲什麼對象沒有被保存?

回答

8

您不保留更改的對象。

pagecontents[0].description = form.cleaned_data['description'] 

這使得對象從pagecontents[0],改變description,然後失去跟蹤對象,它獲取在某一時刻收集的垃圾。

pagecontents[0].save() 

這使得從pagecontents[0]另一個對象並保存它,它什麼也不做,因爲它是不變的。

pagecontents是一個QuerySet,所以它不會產生任何對象直到它實際運行的查詢,在這種情況下,當你申請[0]它。

你需要保持物體的軌跡:

pagecontent = PageContent.objects.filter(page=page)[0] 
pagecontent.description = form.cleaned_data['description'] 
pagecontent.save() 
+0

就是這樣。編碼幾乎沒有睡眠的危險,使你監督這樣清晰的事情。 – arustgi

+0

任何人都可以進一步解釋這一點嗎?爲什麼'pagecontents [0] .description'使對象丟失,但是pagecontent = PageContent.objects.filter(page = page)[0]'和'pagecontent.description = form.cleaned_data ['description']'doesn 「T?對我來說,這些看起來像是一樣的東西。 – rofls

+0

因爲'pagecontents [0]'不是一個變量。這是一個臨時值,它是'[]'('__getitem__')操作的結果,一旦行結束,對該對象的引用就會丟失。所以你必須把這個引用放在一個變量中才能保持。 - 換句話說,'pagecontents [0] .save()'中的'pagecontents [0]'從'pagecontents'中獲取對象的一個​​新副本,當'save'被調用時它什麼都不做,因爲它沒有改變。 –