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
.
有什么关系
祝你好运!
我相信这应该很容易,但它带来了一些挑战,谷歌搜索没有任何建议。
我有一个像这样的 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
.
祝你好运!