[英]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.