Django ORM:如何根据注释timedelta结果进行过滤

6

我有一个像这样的模型:

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。它试图将 timedelta 与 datetime 的正则表达式进行匹配。

有什么想法吗?

提前感谢!


.filter(end__lte=models.F("start")+timedelta(seconds=300))。类似这样的吗? - itzMEonTV
@duduklein:你可能需要指定注释为DurationField - Willem Van Onsem
@itzMEonTV 这个也可以,谢谢。 - duduklein
1个回答

5

我认为问题在于您需要将注释列的类型指定为 Django 的 DurationField。因此,您可以这样编写:

from datetime import timedelta
from django.db.models import <b>ExpressionWrapper</b>, F, <b>DurationField</b>

delta = <b>ExpressionWrapper(</b>F("end")-F("start")<b>, DurationField())</b>

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对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接