过滤相对小时范围的查询

时间:2016-06-17 13:08:46

标签: python django django-queryset django-orm

我试着写一个查询,给我过去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)

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

1 个答案:

答案 0 :(得分:2)

你在计算错误的范围。你的开始时间是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)

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