Django 模型时间戳范围过滤器

Django model time stamp range filter

我有一个模型字段 time_stamp = models.DateTimeField(timezone.now)。现在我想根据日期范围进行搜索,例如 2016-11-08 到 2016-12-08。我该怎么做。

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#range

import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
Model.objects.filter(time_stamp__range=["2016-11-08", "2016-12-08"])

链接Django database query: How to filter objects by date range?

来自 range 查找的文档:

Filtering a DateTimeField with dates won’t include items on the last day, because the bounds are interpreted as “0am on the given date”.

考虑到这一点,如果您想要最后日期的项目,即 2016-12-08,您可以考虑在过滤中使用 2016-12-09

import datetime
start_date = datetime.date(2016, 11, 8)
# use the day after 2016-12-08 to include it
end_date = datetime.date(2016, 12, 9)
Model.objects.filter(time_stamp__range=(start_date, end_date))

或者,使用 gtelte 查找:

import datetime
start_date = datetime.date(2016, 11, 8)
end_date = datetime.date(2016, 12, 8)
Model.objects.filter(time_stamp__gte=start_date, time_stamp__lte=end_date))

如果您的 django 版本 >= 1.9,您可以在日期时间字段上使用 date 强制转换。

Model.objects.filter(time_stamp__date__gte=start_date, time_stamp__date__lte=end_date)

这也会考虑时区转换。其他答案的问题是他们没有考虑过滤是在 datetime 字段上完成的。

关于此的 Django 文档:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#date