如何将 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 中的微秒/分钟数?的主要内容,如果未能解决你的问题,请参考以下文章
如何将用户输入转换为 gnu prolog 中的可重用谓词?