Django ORM:如何根据注释时间增量结果进行过滤



我有一个这样的模型:

class Interval(models.Model):
start = models.Datetime()
end = models.Datetime(null=True)

我想查询所有大于 5 分钟的间隔。 我能做到intervals=Interval.objects.exclude(end=None).annotate(d=models.F("end")-models.F("start"))

当我做intervals[0].d时,我有间隔,这是正确的。现在我只想获得d大于 5 分钟的条目作为结果。

我尝试了intervals=Interval.objects.exclude(end=None).annotate(d=models.F("end")-models.F("start")).filter(d__gt=timedelta(0, 300)),但是出现以下错误:TypeError: expected string or bytes-like object。它尝试将时间增量与日期时间的正则表达式相匹配。 `

有什么想法吗?

提前致谢

我认为问题是您必须将注释列的类型指定给 Django 作为DurationField。所以你可以这样写:

from datetime import timedelta
from django.db.models importExpressionWrapper, F,DurationField
delta =ExpressionWrapper(F("end")-F("start"), DurationField())
intervals = (Interval.objects.exclude(end=None)
.annotate(d=delta)
.filter(d__gt=timedelta(0, 300)))

这将构造一个查询,如下所示:

SELECT id, start, end TIMESTAMPDIFF(MICROSECOND, start, end) AS `d`
FROM interval
WHERE TIMESTAMPDIFF(MICROSECOND, start, end) > 300000000

但是我们在这里给 Django 一个提示,如何解释d字段(作为DurationField(,从而如何">序列化"timedelta对象(。

最新更新