Django的带除法的注释计数返回整数而不是浮点数

Posted

技术标签:

【中文标题】Django的带除法的注释计数返回整数而不是浮点数【英文标题】:Django's annotate Count with division returns integer instead of float 【发布时间】:2017-04-26 18:35:46 【问题描述】:

我有很多对象,其中 3 个具有 name='AAA'

我将它们按“名称”分组并在组中注释 num:

my_models = MyModel.objects.order_by('name').values('name').annotate(count=Count('name'))

for i in my_models:
    print(i.count, i.name)

我明白了:

3, 'AAA'
1, 'BBB'
...

一切都很好,但是当我尝试添加一些公式来注释 Count() 时:

my_models = MyModel.objects.order_by('name').values('name').annotate(count=Count('name') / 2)

我明白了:

1, 'AAA'
0, 'BBB'
...

但预期:

1.5, 'AAA'
0.5, 'BBB'
...

编辑:

Python 的划分通过 Django 的 ORM 与 SQL 的划分不同, 所以 python 3 中的 2/1 返回 2.0 - 好的,但不是在 SQL 中

【问题讨论】:

/ 2.0 怎么样? @jonrsharpe 不,python 的划分和 SQL 的划分不同 :( 在 Django 1.10 中你可以使用Cast,见this answer。在 Django 1.8+ 上,您也许可以使用 ExpressionWrapper @Alasdair 非常感谢,伙计! 【参考方案1】:

完整答案关注@Alasdair's comment:

from django.db.models import FloatField
from django.db.models.functions import Cast

qs = MyModel.objects.order_by('name').values('name').annotate(
    count=Cast(Count('name') / 2.0, FloatField()))

【讨论】:

@rluts ,尝试先转换两个变量,例如 total=Cast(Count('id'), FloatField() / Cast(Count('id'), FloatField())跨度>

以上是关于Django的带除法的注释计数返回整数而不是浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Python中整数运算除法,输出带浮点数

js 后端返回浮点数,前端用乘法或者除法处理,得到超常值

操作符

python的/和//运算

python // 和 / 的区别是啥?

c语言操作符总结