django Model.objects.raw将SUM字段返回为Decimal

时间:2013-06-20 21:18:12

标签: python django django-models

我的django模型定义如下:

class Foo(models.Model):
    bar = models.IntegerField(null=True)
    baz = models.ForeignKey(Baz)

class Baz(models.Model):
    bat = models.IntegerField(null=True)

我对它执行Foo.objects.raw()聚合查询,如下所示:

sql = """
      SELECT -1 AS id,
      SUM( foo.bar ) AS bar
      FROM myapp_foo
      LEFT JOIN myapp_baz ON foo.baz_id = baz.id
      GROUP BY myapp_baz.id;
      """

aggregate_foo = Foo.objects.raw(sql)

哪一个都可以,但是当我访问aggregate_foo.bar时,它返回一个Decimal而不是int!当然,事实上我可以将条形码转换为int,但我宁愿以正确的方式做到这一点。

还有其他人遇到django raw()函数的这个未记录的“功能”吗?是否有正确的方法来编写sql,以便它将SUM()字段作为int返回?我理解我不需要在上面的例子中执行原始查询,但是我只是假设为了这个问题我不能使用Foo.objects.aggregate()

Dunno,如果它对这个问题至关重要,但我的数据存储区是MySQL 5.5

1 个答案:

答案 0 :(得分:2)

这是MySQL的一个功能,而不是django。因此没有在django中记录。

来自the documentation

  

对于数字参数,方差和标准差函数   返回DOUBLE值。 SUM()和AVG()函数返回DECIMAL   精确值参数的值(整数或DECIMAL)和DOUBLE   近似值参数的值(FLOAT或DOUBLE)。 (在MySQL之前   5.0.3,SUM()和AVG()为所有数字参数返回DOUBLE。)

因此结果。