1

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

我已经num_in_stock直接从数据库中更新了。数量在数据库中都是正确的,但在我的网站上却不正确。我知道解决方案就在这里,但我不知道该怎么办。我真的需要为我详细说明。

您将如何在 Cartridge 中使用它来刷新num_in_stock?

4

3 回答 3

6

这应该是更新一个对象所需要做的所有事情。将 object_name 替换为您的对象。

object_name.refresh_from_db()
于 2016-08-04T15:11:52.790 回答
3

我假设 num_in_stock 是您的模型类的一个属性。如果为真,你应该得到一个类的实例(即 object_name)然后 object_name.refresh_from_db()

之后,您可以像访问它object_name.num_in_stock

于 2016-09-15T01:53:20.647 回答
0

我假设您使用的是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().

于 2021-03-20T14:03:03.303 回答