在Django中使用refresh_from_db的正确方法是什么?

时间:2015-09-08 17:41:34

标签: python django cartridge

我正在使用Django 1.8,Mezzanine,Cartridge,我使用Postgresql作为数据库。

我直接从数据库更新了num_in_stock。数量在数据库中都是正确的,但在我的网站上没有。我知道解决方案是here,但我不知道如何处理。我真的需要它为我拼写。

你在Cartridge中如何使用它来刷新num_in_stock

3 个答案:

答案 0 :(得分:2)

我假设num_in_stock是模型类的属性。如果为true,则应该获取该类的实例(即object_name) object_name.refresh_from_db()

之后,您可以像object_name.num_in_stock

一样访问它

答案 1 :(得分:1)

这应该是更新一个对象所需要做的全部工作。将object_name替换为您的对象。

object_name.refresh_from_db()

答案 2 :(得分:0)

我假设您使用的是 F expression

根据documentationF expression

<块引用>

...使得可以引用模型字段值并执行 使用它们的数据库操作而无需实际拉动它们 出数据库到 Python 内存中。

您直接在数据库中工作。 Python 对模型字段的值一无所知。内存上什么都没有,一切都发生在数据库上。

文档示例:

from django.db.models import F

reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()
<块引用>

虽然 reporter.stories_filed = F('stories_filed') + 1 看起来像一个 实际上,Python 将值正常分配给实例属性 它是一个 SQL 结构,用于描述对数据库的操作。


因此,要让 Python 知道这个值,您需要重新加载对象。

<块引用>

要访问以这种方式保存的新值,对象必须是reloaded

reporter = Reporters.objects.get(pk=reporter.pk)
# Or, more succinctly:
reporter.refresh_from_db()

在您的示例中:

object_name.refresh_from_db()

还有一件事......

F() 赋值在 Model.save() 之后持续存在

<块引用>

F() 对象分配给 保存模型实例后模型字段仍然存在,并将 应用于每次 save()。

reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()

reporter.name = 'Tintin Jr.'
reporter.save()
<块引用>

stories_filed 在这种情况下将更新两次。如果是最初 1,最终值为 3。这种持久化可以通过 保存后重新加载模型对象,例如,使用 refresh_from_db()