【发布时间】:2013-12-19 11:07:51
【问题描述】:
我有一个 Django 模型 WalletJournal,它有许多十进制值字段,示例模型类定义如下所示:
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 来添加条目并将重复项保持在最低限度,但我发现在获取小数点时出现了一些非常奇怪的行为。尝试匹配字符串或十进制视图不返回结果:
>>> 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我可以从各种get语句中看到以下查询结果:
__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
我在比较方面做错了吗?
【问题讨论】:
-
你用的是什么数据库?
-
MySQL 服务器版本:5.1.72-0ubuntu0.10.04.1
-
max_digits 和 decimal_places 的值有变化吗?另外,sql_mode 的值是多少?我正在查看dev.mysql.com/doc/refman/5.1/en/precision-math-expressions.html,看看是否会发生一些奇怪的事情,但我还没有看到会发生这种情况的条件。
-
您可以查看生成的 SQL(使用 connection.queries)以了解 SQL ILIKE 获取结果的原因。
-
我已经用结果更新了问题,这看起来是因为查询是用 django 使用
'转义的值构造的。现在我不知道这是 Django 问题还是 MySQL 问题 :)
标签: mysql django object get decimal