我正在使用Django 1.8,Mezzanine,Cartridge,我使用Postgresql作为数据库。
我直接从数据库更新了num_in_stock
。数量在数据库中都是正确的,但在我的网站上没有。我知道解决方案是here,但我不知道如何处理。我真的需要它为我拼写。
你在Cartridge中如何使用它来刷新num_in_stock
?
答案 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
。
根据documentation和F 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()
。