1

我有一个定义如下的 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!当然,我可以在事后将 bar 转换为 int ,但我宁愿以正确的方式这样做。

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

不知道这对这个问题是否至关重要,但我的数据存储是 MySQL 5.5

4

1 回答 1

2

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

文档

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

因此结果。

于 2013-06-20T21:24:31.870 回答