如何在Django中过滤DateTimeField的日期?

224 投票
21 回答
297347 浏览
提问于 2025-04-15 13:48

我正在尝试过滤一个 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 和日期太复杂了"。

撰写回答