Django管理器,其F查询中包含datetime.timedelta对象,并结合了注释和过滤器

时间:2019-05-24 16:51:14

标签: django python-3.x django-managers

我正在尝试在我的应用程序中创建管理器方法,以过滤已创建5/10/15分钟或如此之久的电子邮件对象,从现在开始准确计数。

尽管我要使用注释来创建新参数,但它将是布尔值,并且他的状态取决于除以简单减法并检查结果是否大于0。

from django.db.models import F
from django.utils import timezone


delta = 60 * 1 * 5
current_date = timezone.now()
qs = self.annotate(passed=((current_date - F('created_at')).seconds // delta > 0)).filter(passed=True)

自动取款机我的错误说:
AttributeError: 'CombinedExpression' object has no attribute 'seconds'

很明显,((current_date - F('created_at'))的计算结果不是datetime.timedelta对象,而是CombinedExpression对象。

我看到了更多的问题,即如何将表达式与0进行比较?

无论如何,如果我接近实现目标或者我在此查询背后的整个逻辑都不正确

,将不胜感激

3 个答案:

答案 0 :(得分:0)

好吧,我设法找到了解决方案,即使它可能不是一个优雅的解决方案,它仍然有效

qs = self.annotate(foo=Sum(current_date - F('created_at'))).filter(foo__gt=Sum(timezone.timedelta(seconds=delta)))

答案 1 :(得分:0)

为什么不这样:

time_cut_off = timezone.now() - timezone.timedelta(minutes=delta)
qs = self.filter(created_at__gte=time_cut_off)

这将为您提供在最近的 delta 分钟内创建的消息。或者,您在哪里查找恰好在5分钟前创建的消息(如果这是问题的话,该如何定义)。

答案 2 :(得分:0)

如果您的时间增量是常数,则文档提供a simple and elegant solution

  

对于日期和日期/时间字段,您可以添加或减去timedelta对象。以下内容将返回在发布后超过3天被修改的所有条目:

>>> from datetime import timedelta
>>> Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))

就您而言,我认为您甚至不需要F()对象。