【问题标题】:Filter query with relative hour range使用相对小时范围过滤查询
【发布时间】:2016-10-19 08:10:48
【问题描述】:

我正在尝试编写一个查询,以向我提供过去 24 小时开始的所有条目,但不超过过去 25 小时。

因此,如果执行查询的日期和时间是06.17.2016 15:00,我想查找开始日期在06.16.2016 15:0006.16.2016 15:59 之间的每个条目

尝试使用__range,但使用小时数似乎不起作用。甚至可以使用.filter() 做到这一点吗?

这是我的代码:

class Entry(models.Model):
    startdate = models.DateTimeField()

-

start = timezone.now().date() - relativedelta(hours=+24)
end = timezone.now().date() - relativedelta(hours=+25)

list = Entry.objects.filter(startdate__gte=start, startdate__lte=end)

编辑:

list 给出一个空的查询集。

编辑 2:

relativedelta 似乎是个问题

start = timezone.now().date() - relativedelta(hours=+24, seconds=+1) 给我 datetime.datetime(2016, 6, 16, 0, 59, 59)

end = timezone.now().date() - relativedelta(hours=+25, seconds=+1) 给我 datetime.datetime(2016, 6, 15, 22, 59, 59)

如果我想让它工作,我想需要解决这个问题。

【问题讨论】:

  • 你的方法有什么问题?
  • 不确定是什么问题,但我尝试时只得到一个空查询集。

标签: python django django-queryset django-orm


【解决方案1】:

您计算的范围有误。您的开始时间是 24 小时前,结束时间是 25 小时前,您应该开始时间为 25 小时前,结束时间为 24 小时前。

start = timezone.now().date() - relativedelta(hours=+25)
end = timezone.now().date() - relativedelta(hours=+24)
list = Entry.objects.filter(startdate__gte=start, startdate__lte=end)

您的代码中存在问题的其他事情,您不应该使用timezone.now().date() 来计算时间范围,因为您的字段是DateTimeField 并且您正在处理时间,所以date 显然不够精细(即使它仍然可以使用date(),但这个概念是错误的):

start = timezone.now() - relativedelta(hours=+25)
end = timezone.now() - relativedelta(hours=+24)

另外,请始终在问题正文中清楚地说明您的问题,就像您的查询集是空的一样,这将让其他人更容易判断您有什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多