如何将 DurationField 的值转换为 QuerySet 中的微秒/分钟数?

Posted

技术标签:

【中文标题】如何将 DurationField 的值转换为 QuerySet 中的微秒/分钟数?【英文标题】:How can I convert the value of a DurationField to its number of microseconds/minutes in a QuerySet? 【发布时间】:2020-11-18 01:29:45 【问题描述】:

假设我有两个模型:Computer 和 DailyUsage。 DailyUsage 有一个名为 usage_duration 的 DurationField。在计算机的 QuerySet 上,我想注释平均每日使用量以分钟为单位。计算机平均每天使用的时间每增加一分钟,计算机的“重要性”就会增加。

我见过一些人使用 ExpressionWrapper 将 DurationField 转换为其 BigIntegerField 表示的示例*,但尝试这样做:

average_in_duration_annotated = Computer.objects.annotate(
    avg=Avg("daily_usages__usage_duration", filter=Q(daily_usages__date__gte=one_month_ago))
)

average_in_minutes_annotated = average_annotated.annotate(
    avg_in_minutes=ExpressionWrapper(F("avg"), output_field=BigIntegerField()) / Value(10e6 * 60)
)

...结果:

TypeErrorint() argument must be a string, a bytes-like object or a number, not 'datetime.timedelta' 查询集被评估时。

另一个以同样方式失败的例子:

Computer.objects.annotate(
    total_usage_microseconds=Sum("daily_usages__usage_duration", output_field=BigIntegerField())
)

如何将 DurationField 的值转换为其在 QuerySet 中的微秒数?

* Aggregate in django with duration field

【问题讨论】:

【参考方案1】:

因为我使用的是postgres,所以可以使用Seconds from django-pg-utils:

qs.annotate(
    avg_usage_minutes=Avg(
        Seconds(F("daily_usages__usage_duration")) / Value(60),
        filter=Q(daily_usages__date__gte=one_month_ago)
    )
)

【讨论】:

以上是关于如何将 DurationField 的值转换为 QuerySet 中的微秒/分钟数?的主要内容,如果未能解决你的问题,请参考以下文章

VBA 如何将数字转换为中文大写

java布尔值如何转换为0 1

如何将用户输入转换为 gnu prolog 中的可重用谓词?

如何将STRING类型的值转换为BASE64 STRING类型的值

如何将 const void* 强制转换为结构元素?

如何将地址转换为谷歌地图链接(不是地图)