2011-09-01 37 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'被调用时它什么都不做,因为它没有改变。 –