【问题标题】:Django Model not saving.. Totally confused hereDjango模型没有保存..这里完全混淆了
【发布时间】:2011-09-01 05:01:18
【问题描述】:

我的视图中有以下代码

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>

为什么对象没有被保存?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    您没有保留更改的对象。

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

    这会从pagecontents[0] 创建一个对象,更改description,然后失去对该对象的跟踪,该对象会在某个时候被垃圾收集。

    pagecontents[0].save()
    

    这会从pagecontents[0] 创建另一个对象并保存它,因为它没有改变,所以什么都不做。

    pagecontents 是一个查询集,因此在实际运行查询之前它不会创建 任何 对象,在这种情况下是当您将 [0] 应用于它时。

    您需要跟踪对象:

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

    【讨论】:

    • 就是这样。很少睡觉编码的危险,让你监督如此清晰的事情。
    • 谁能进一步解释一下?为什么pagecontents[0].description 会创建一个丢失的对象,而pagecontent = PageContent.objects.filter(page=page)[0]pagecontent.description = form.cleaned_data['description'] 不会?在我看来,这些看起来是一样的。
    • 因为pagecontents[0] 不是变量。这是一个临时值,是 [] (__getitem__) 操作的结果,一旦行结束,对该对象的引用就会丢失。因此,您必须将该引用放在一个变量中以使其保持不变。 -- 换句话说,pagecontents[0].save() 中的pagecontents[0]pagecontents 中获取对象的新副本,当调用save 时它什么也不做,因为它没有改变。
    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2013-04-23
    相关资源
    最近更新 更多