我正在尝试过滤某一天安排的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)
无需说我已经尝试寻找解决方案而找不到任何解决方案。
答案 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
)进行,至少是我得到的。