我正在尝试在我的应用程序中创建管理器方法,以过滤已创建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进行比较?
无论如何,如果我接近实现目标或者我在此查询背后的整个逻辑都不正确
,将不胜感激答案 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()
对象。