Django 表达式 DateTime 和 Integer 秒

mas*_*oda 3 python django django-models django-queryset

我想用 Django 1.11 注释旧版 MySQL DB 上的 DateTime 和 Integer(秒)之间的差异(因此没有机会将 IntegerField 更改为 DurationField)

Report(Model):
    # time the report was sent
    time = DateTimeField()
    # seconds since the last reboot
    uptime = IntegerField()

MyModel.objects.all().annotate(
    last_report=Max(time),
    last_reboot=ExpressionWrapper(F('last_report') - F('uptime')), output_field=DateTimeField())
)
Run Code Online (Sandbox Code Playgroud)

如果是 DurationField(),则这可以工作uptime,但不适用于整数。所以我尝试将秒转换为时间增量

last_reboot=ExpressionWrapper(
    F('last_report') - F(timezone.timedelta(seconds=1)*F('uptime')),
    output_field=DateTimeField()
)
Run Code Online (Sandbox Code Playgroud)

这给了我

属性错误位于...

“CombinedExpression”对象没有属性“split”

有没有办法在查询表达式中使用 DateTimeField() 和 IntegerField() 进行计算?

mas*_*oda 5

我找到了一个解决方案:使用 . 将整数转换为持续时间ExpressionWrapper。当我得到秒并且 aDurationField()是微秒时,我必须将它们乘以 1,000,000。

last_reboot=ExpressionWrapper(
    F('last_report') - ExpressionWrapper(
        F('uptime') * 1000000,
        output_field=DurationField()
    ),
    output_field=DateTimeField()
)
Run Code Online (Sandbox Code Playgroud)