2013-12-19 58 views
1

我有具有许多与十进制值的字段,以及例如模型类定义看起来像一个Django模型WalletJournal:Django的对象获取

balance = models.DecimalField(max_digits=20,decimal_places=2) 

相应的MySQL列定义为:

`balance` decimal(20,2) NOT NULL, 

而当通过它的id检索行并返回余额时,它看起来是正确的。

>>> WalletJournal.objects.get(id=855).balance 
Decimal('1295599062.45') 
>>> 

我试图使用get_or_create添加条目,并保留副本到最低限度,但我看到上小数的得到一些非常STANGE行为。试图匹配视图字符串或十进制不返回任何结果:

>>> WalletJournal.objects.get(balance='1295599062.45') 
DoesNotExist: WalletJournal matching query does not exist. 
>>> WalletJournal.objects.get(balance=Decimal(str('1295599062.45'))) 
DoesNotExist: WalletJournal matching query does not exist. 

但是,如果我符合使用__iexact我得到正确的结果:

>>> WalletJournal.objects.get(balance__iexact='1295599062.45') 
<WalletJournal: joeb - 1XXXX00 - Acyclic Tau(9XXXX307) - Repair Bill(2013-11-30 15:55:01)> 

我不相信__iexact是不是一个完美的解决方案,如果有人可以建议我做错了什么,这将是非常有益的。

我目前正在运行Django 1.6和Python 2.6.5。 MySQL服务器版本:5.1.72-0ubuntu0.10.04.1(Ubuntu的)

使用connection.queries我可以从各种报表获取请参见下面的查询结果:

__iexact  --> `balance` LIKE '1295599062.45' : Matches 
__exact  --> `balance` = '1295599062.45' : No Match 
str   --> `balance` = '1295599062.45' : No Match 
Decimal(str( --> `balance` = '1295599062.45' : No Match 
Raw SQL  --> `balance` = 1295599062.45  : Matches 

难道我做错了什么与比较?

+0

您正在使用什么数据库? –

+0

MySQL服务器版本:5.1.72-0ubuntu0.10.04.1 – ModulusJoe

+0

是否更改了max_digits和decimal_places的值?另外,sql_mode的值是多少?我正在浏览http://dev.mysql.com/doc/refman/5.1/en/precision-math-expressions.html,看看是否会发生一些奇怪的事情,但我没有看到会发生什么情况。 –

回答

0

这看起来是mysql的查询处理中的一个错误。我现在已经在Server version: 5.5.34-0ubuntu0.12.04.1 (Ubuntu)测试成功,并查询

WalletJournal.objects.get(balance='1295599062.45') 

现在,作为与查询预计其执行结果返回以下WHERE语句:

`balance` = '1295599062.45'