使用Window注释计算与Django查询集上的上一个对象的时差

时间:2019-06-12 20:47:09

标签: django orm window django-queryset

我的模型有一个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函数,但是我想知道是否还有另一种方法可以做我想做的事情。有什么建议吗?

谢谢

0 个答案:

没有答案