2017-08-17 201 views
1

我试图过滤在某一天安排的Match。我不能做到这一点:Django:日期时间按日期过滤忽略时间

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) 

不需要说我已尝试寻找解决方案,找不到任何。

+0

查看https://stackoverflow.com/a/1973917/2689986 –

+0

@AshishNitinPatil这实际上是我的第二个解决方案 – dabadaba

+0

我提到了这句话:因为它非常详细,有计划使用'__date'运算符来改进语法。请查看“[#9596比较DateTimeField与日期太难](http://code.djangoproject.com/ticket/9596)”了解更多详情。 –

回答

2

从Django 1.9开始,你可以使用__date field lookup,正如你在你的问题中提到的那样。对于旧版本,您将不得不处理其他方法。

0

如果您不能使用__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的settings.pyUSE_TZ=True,你会得到警告:

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

但过滤器仍然有效。比较将在Django的时区(TIME_ZONEsettings.py),至少这是我得到的。