繁体   English   中英

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

[英]What is the correct way to use refresh_from_db in Django?

我使用的是 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM