2

我相信这应该很容易,但它提出了一些挑战,并且没有任何建议出现在谷歌上。

我有一个这样的 django 模型: Affiliate -> Account 其中 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)

但这些都没有预期的效果......

所以......当我断言时如何获得成功的测试

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))
4

1 回答 1

4

你怎么得到你的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应该返回十进制值。用于isinstance验证类型是否为Decimal. 从那里您尝试的内容看起来是正确的,因为您只是将十进制值与十进制值进行比较。我看不出这与使用F.

祝你好运!

于 2017-06-20T01:06:34.160 回答