Django:日期时间按日期过滤忽略时间
问题描述:
我试图过滤在某一天安排的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)
不需要说我已尝试寻找解决方案,找不到任何。
答
如果您不能使用__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.py
有USE_TZ=True
,你会得到警告:
RuntimeWarning: DateTimeField (...) received a naive datetime (...) while time zone support is active.
但过滤器仍然有效。比较将在Django的时区(TIME_ZONE
从settings.py
),至少这是我得到的。
查看https://stackoverflow.com/a/1973917/2689986 –
@AshishNitinPatil这实际上是我的第二个解决方案 – dabadaba
我提到了这句话:因为它非常详细,有计划使用'__date'运算符来改进语法。请查看“[#9596比较DateTimeField与日期太难](http://code.djangoproject.com/ticket/9596)”了解更多详情。 –