如何在Django中过滤DateTimeField的日期?
我正在尝试过滤一个 DateTimeField
,也就是想要根据日期来筛选数据。我的意思是:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
我得到的查询结果是一个空列表,因为(我觉得)我没有考虑时间,但我想要的是“任何时间”。
在Django中,有没有简单的方法可以做到这一点?
我的日期时间中已经设置了时间,并不是 00:00
。
21 个回答
118
这是我用ipython的timeit函数得到的结果:
from datetime import date
today = date.today()
timeit[Model.objects.filter(date_created__year=today.year, date_created__month=today.month, date_created__day=today.day)]
1000 loops, best of 3: 652 us per loop
timeit[Model.objects.filter(date_created__gte=today)]
1000 loops, best of 3: 631 us per loop
timeit[Model.objects.filter(date_created__startswith=today)]
1000 loops, best of 3: 541 us per loop
timeit[Model.objects.filter(date_created__contains=today)]
1000 loops, best of 3: 536 us per loop
contains 看起来更快。
120
YourModel.objects.filter(datetime_published__year='2008',
datetime_published__month='03',
datetime_published__day='27')
// 根据评论进行修改
YourModel.objects.filter(datetime_published=datetime(2008, 03, 27))
这个代码不管用,因为它创建了一个时间日期对象,但时间部分都被设置成了0,所以数据库里的时间和这个不匹配。
133
这样的查找功能是在 django.views.generic.date_based
里实现的,具体代码如下:
{'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
datetime.datetime.combine(date, datetime.time.max))}
因为这个写法比较繁琐,所以有计划通过使用 __date
操作符来简化语法。想了解更多细节,可以查看这个链接:"#9596 比较 DateTimeField 和日期太复杂了"。