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

2024-04-20 01:34:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两种型号:电脑和日常用品。DailyUsage有一个名为usage_duration的DurationField。在一组计算机上,我想在分钟内注释平均每日使用量。平均每天使用电脑的时间每增加一分钟,电脑的“重要性”就会增加

我见过一些人使用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)
)

。。。结果:

{TypeError}int() 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


Tags: in示例fieldusageavgdailydurationaverage
1条回答
网友
1楼 · 发布于 2024-04-20 01:34:25

因为我在使用postgres,所以我可以使用来自django-pg-utilsSeconds

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

相关问题 更多 >