Django在注释中将timedelta转换为整数 [英] Django convert timedelta to integer in annotation

查看:71
本文介绍了Django在注释中将timedelta转换为整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要注释两个日期之间的差异,然后汇总四舍五入的平均值.问题在于两个日期之间的差异是 datetime.timedelta ,所以我得到了错误:

I'm annotating the difference between two dates then aggregating the rounded average. The problem is that the difference between the two dates is a datetime.timedelta so I am getting the error:

django.db.utils.ProgrammingError:无法将类型间隔强制转换为数字

django.db.utils.ProgrammingError: cannot cast type interval to numeric

如何在 Avg()中使用整数 days_to_pay.days ?

def aggregate_ar_detail(self):
    queryset = self.annotate(
        days_to_pay=Case(
            When(Q(date_paid__isnull=False), then=F('date_paid') - F('date_trans')),
            default=None,
        )
    ).aggregate(
        avg_days=Round(Avg('days_to_pay')),
    )

我尝试在 models.IntegerField()的注解中指定输出字段,但这会导致:

I've tried specifying the output field on the annotation a models.IntegerField() but it causes:

TypeError:float()参数必须是字符串或数字,而不是'datetime.timedelta'

TypeError: float() argument must be a string or a number, not 'datetime.timedelta'

推荐答案

设法使其与

Managed to get it working with ExtractDay

from django.db.models.functions import ExtractDay

def aggregate_ar_detail(self):
    queryset = self.annotate(
        days_to_pay=Case(
            When(Q(date_paid__isnull=False), then=F('date_paid') - F('date_trans')),
            default=None,
        )
    ).aggregate(
        avg_days=Round(Avg(ExtractDay('days_to_pay'))),
    )

这篇关于Django在注释中将timedelta转换为整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆