我的模型有一个DateTimeField和一个DurationField,以及从插入最后一条记录到当前记录所经过的时间。我正在尝试删除DurationField,但是我必须能够计算“即时”经过的时间。.
这个问题Difference with previous object in django queryset annotation与我的问题非常相似。最佳答案建议使用2.0版随附的Django Window函数。我发现Lead函数只能使用整数,但是我有一个DateTimeField而不是IntegerField,所以我试图将字段转换/转换为时间戳。
这是我的模特:
class Event(models.Model):
date = models.DateTimeField()
time_elapsed = models.DurationField() # TO BE REMOVED
这里是实际的查询集:
Event.objects
.annotate(ts=Cast(Extract('date','epoch'),IntegerField()))
.annotate(next_val=Window(
expression=Lead('ts', offset=1,default=0),
order_by=F('date').asc()),
difference=F('next_val')-F('ts'))
(看起来)它几乎可以工作,但是它需要下一个对象并产生差异,而我需要PREVIOUS对象减去当前对象。我找不到解决方案。
非常感谢!
更新
由于@radoh,我发现了错过的功能(滞后),但不幸的是,我尚未达到目标。
这里是实际的查询集:
qs = Event.objects
.annotate(ts=Cast(Extract('date','epoch'),IntegerField()))
.annotate(prev_ts=Window(expression=Lag('ts',offset=1,default=0),order_by=F('date').asc()),
diff=F('ts')-F('prev_ts'))
我的diff
现在是一个timedelta(事件之间的秒数),现在我想排除值小于36小时的事件。我试图将strait链接filter()或exclude()放到QuerySet上,但似乎不支持:-)
qs.exclude(diff__lt=129600)
ProgrammingError:WHERE中不允许使用窗口函数
我发现不允许使用Window函数,但是我想知道是否还有另一种方法可以做我想做的事情。有什么建议吗?
谢谢