Django - 从 F 表达式中获取值

Django - Getting value from F expression

我相信这应该很容易,但它带来了一些挑战,谷歌搜索没有任何建议。

我有一个像这样的 Django 模型: Affiliate -> Account 其中帐户有一个 balance 属性,用于跟踪帐户余额。因为可以并发修改,所以我用一个F()表达式来修改

事情是......在给定的测试中,我试图将 affiliate.account.balance 与预期值 -1.00(十进制值)进行比较,但它有所不同,因为 de F 表达式不是已解决:

First differing element 12: # (yes... I'm comparing it within an array)
Decimal('-1')
<CombinedExpression: F(balance) - Value(1.00)>

我这样使用 F 表达式:

def charge(self, **kwargs):
    amount = kwargs.get('amount')
    self.balance = F('balance') + amount
    self.save()

一些(也许)重要信息:

$ python3 -m django --version
1.10.5

我试过了

affiliate.account.balance.value()
affiliate.account.balance.getValue()
str(affiliate.account.balance)
repr(affiliate.account.balance)
Decimal(affiliate.account.balance)

但其中 none 具有预期效果...

所以...当我断言

时如何获得成功的测试
self.assertEquals(Decimal(-1.00), affiliate.account.balance)

谢谢!

编辑:

账户模型

class Account(models.Model):
    affiliate = models.OneToOneField(Affiliate, on_delete=models.CASCADE)
    balance = models.DecimalField(_('Balance'), max_digits=20, decimal_places=2, default=Decimal(0.00))

您是如何获得 account 的?在更新对象后,您可能只需要刷新对数据库的引用。参见 https://docs.djangoproject.com/en/1.11/ref/models/instances/#refreshing-objects-from-database

所以有点像..

prevBal = account.balance
...charge({amount:...})
account.refresh_from_db()
newBal = account.balance

老实说,即使在更新后我仍然对您的设置感到困惑。

至于访问 Decimal 值并在测试中对其进行验证.. accounts.balance 应该 return 十进制值。使用 isinstance 验证类型是 Decimal。从那里你尝试的看起来是正确的,因为你只是将十进制值与十进制值进行比较。我看不出这与使用 F.

有什么关系

祝你好运!