2017-06-19 130 views
1

我相信这应该是相当容易的,但它提出了一些挑战,并且没有任何建议可以通过Google进行搜索。Django - 从F表达中获得价值

我有一个Django模型是这样的: Affiliate -> Account 其中帐户有balance属性,它跟踪账户余额。由于它可以同时修改,因此我使用F()表达式来修改它。

事情是...在给定的测试,我试图比较affiliate.account.balance与预期值-1.00(十进制值),但不同,因为德˚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) 

谢谢!

编辑:

Account模型

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)) 
+0

你是如何在'Account'模型上声明你的'balance'字段的? –

+0

请问您是否需要为您的账户模式发布代码?它将使回答这个问题变得更容易。 – DragonBobZ

+0

它就是这样。我没有直接发帖,因为我觉得这很微不足道。 – coya

回答

1

你是如何让你的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有什么关系。

祝你好运!

+1

谢谢尼克!你是对的!由于我在使用'affiliate.refresh_from_db()'后有这个参考模型'Affiliate - > Account',余额属性在'Account'中, ,余额属性没有刷新,而是做了'affiliate.account。refresh_from_db()' 做得不够好...... – coya

+0

很高兴我可以帮忙:)祝你有个美好的一天 –