我正在使用 Django 1.8、Mezzanine、Cartridge,并且我使用 Postgresql 作为数据库。
我已经num_in_stock
直接从数据库中更新了。数量在数据库中都是正确的,但在我的网站上却不正确。我知道解决方案就在这里,但我不知道该怎么办。我真的需要为我详细说明。
您将如何在 Cartridge 中使用它来刷新num_in_stock
?
我正在使用 Django 1.8、Mezzanine、Cartridge,并且我使用 Postgresql 作为数据库。
我已经num_in_stock
直接从数据库中更新了。数量在数据库中都是正确的,但在我的网站上却不正确。我知道解决方案就在这里,但我不知道该怎么办。我真的需要为我详细说明。
您将如何在 Cartridge 中使用它来刷新num_in_stock
?
这应该是更新一个对象所需要做的所有事情。将 object_name 替换为您的对象。
object_name.refresh_from_db()
我假设 num_in_stock 是您的模型类的一个属性。如果为真,你应该得到一个类的实例(即 object_name)然后
object_name.refresh_from_db()
之后,您可以像访问它object_name.num_in_stock
我假设您使用的是F expression
.
根据文档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 知道这个值,您需要重新加载对象。
要访问以这种方式保存的新值,必须重新加载对象:
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()
.