【问题标题】:Django annotate F() / F() "rounds" unexpectedlyDjango 注释 F() / F() 出乎意料地“轮回”
【发布时间】:2016-04-09 14:55:40
【问题描述】:

我有一个 Django 1.9 查询集 qs,我在其中添加了以下注释:

qs = qs.annotate(total_messages=
    Sum(Case(..., output_field=FloatField()))

qs = qs.annotate(spam_messages=
    Sum(Case(..., output_field=FloatField()))

qs = qs.annotate(spam_rate=F('spam_messages')/F('total_messages'))

奇怪的是,结果似乎向下舍入(如 Math.floor),所以我得到以下结果(示例):

total_messages = 40.0, spam_messages = 24.0, spam_rate = 0.0
total_messages = 10.0, spam_messages = 10.0, spam_rate = 1.0

此外,这种行为可能仅在从 Django 1.7 升级到 Django 1.9 后发生。

我做错了什么还是一个错误?

提前致谢!

【问题讨论】:

  • 你能充实你Case表达式中的...吗?

标签: python django django-orm annotate


【解决方案1】:

好的,感谢 lac 的评论,找到了问题:

Inside the Case(...) 我有这样的陈述:

When(
    message__date__gte=one_month_ago,
    then=1
    )

如果我将 1 更改为 1.0,一切都会按预期工作。

不过,这对我来说似乎是一个错误,尤其是因为我指定了 output_field=FloatField(),但即使使用 IntegerFields,我也相信除法应该返回小数,不是吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2020-02-08
    • 2019-10-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多