我正在使用Django 1.8,Mezzanine,Cartridge,并使用Postgresql作为数据库。我已经直接从数据库更新了num_in_stock。在数据库中所有数量都是正确的,但在我的网站上不正确。我知道解决方案在here,但我不知道该怎么做。我真的需要有人给我详细解释一下。你会如何在Cartridge中使用它来刷新num_in_stock?
object_name.refresh_from_db()
F表达式
。F表达式
: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()
。我假设num_in_stock是您的模型类的属性。如果是这样,您应该获取该类的实例(即object_name),然后使用下面的代码进行刷新:
object_name.refresh_from_db()
之后,您可以像这样访问它:
object_name.num_in_stock
refresh_from_db()
。 - KlausCPHfilter().update(F("balance") + amount)
更新用户余额的方法,但是如果我在测试函数内执行refresh_from_db(),我只能得到旧值。而在方法本身内执行刷新(而不是在测试函数内),则可以获得预期的值并通过测试:\ - Salma Hassan