我有一个这样的模型:
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
对象(。