gpt4 book ai didi

Django ORM : How can I filter based on an annotation timedelta result

转载 作者:行者123 更新时间:2023-12-01 01:45:03 25 4
gpt4 key购买 nike

我有一个这样的模型:

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 的正则表达式匹配。
`

有任何想法吗?

提前致谢

最佳答案

我认为问题在于您必须将带注释的列的类型指定为 Django 为 DurationField .所以你可以这样写:

from datetime import timedelta
from django.db.models import ExpressionWrapper, 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目的)。

关于Django ORM : How can I filter based on an annotation timedelta result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50506668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com