Django:按日期忽略时间的日期时间过滤器

时间:2017-08-17 12:16:53

标签: python django

我正在尝试过滤某一天安排的Match个。我不能这样做:

match_queryset.filter(start=date)

因为它也按时间过滤,但我可以这样做:

match_queryset.filter(start__year=a_date.year, start__month=a_date.month, start__day=a_date.day)

但这太复杂了,我觉得可能会有更简单的方法。

然后我也可以使用范围:

t0 = datetime.datetime.combine(a_date, datetime.time(0, 0))
t1 = datetime.datetime.combine(a_date, datetime.time(23, 59, 59))
match_queryset.filter(start__gte=t0, start__lte=t1)

但这似乎是一种矫枉过正,它可能会产生一种低效的查询。

我不能只针对实际日期进行查询吗?类似的东西:

# this of course doesn't work
match_queryset.filter(start__date=date)

无需说我已经尝试寻找解决方案而找不到任何解决方案。

2 个答案:

答案 0 :(得分:5)

从Django 1.9开始,您可以使用__date field lookup,就像您在问题中提到的那样。对于旧版本,您将需要使用其他方法。

答案 1 :(得分:1)

如果您无法使用__date过滤器,我认为最干净的方法是:

from datetime import datetime, timedelta

d = datetime.now()  # or whatever you want

match_queryset.filter(start__gte=d.date(), start__lt=d.date()+timedelta(days=1))

如果您在Django USE_TZ=True中有settings.py,则会收到警告:

RuntimeWarning: DateTimeField (...) received a naive datetime (...) while time zone support is active.

但过滤器仍然有效。比较将在Django的时区(TIME_ZONE来自settings.py)进行,至少是我得到的。