【问题标题】:Django Object Get on Decimal MatchDjango 对象获取十进制匹配
【发布时间】: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


【解决方案1】:

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

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

现在按预期返回结果,正在执行的查询具有以下 where 语句:

`balance` = '1295599062.45'

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2011-01-02
    • 2011-11-09
    • 1970-01-01
    • 2017-10-22
    • 2014-12-03
    • 2017-09-06
    • 2012-10-26
    • 2018-08-26
    相关资源
    最近更新 更多