我试图过滤一个DateTimeField与日期比较。我的意思是:

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))

我得到一个空的查询集列表作为答案,因为(我认为)我没有考虑时间,但我想要“任何时间”。

Django中有简单的方法来做这个吗?

我在datetime中设置了时间,不是00:00。


当前回答

嗯. .我的解决方案是有效的:

Mymodel.objects.filter(date_time_field__startswith=datetime.datetime(1986, 7, 28))

其他回答

现在Django在开发版本中有__date queryset过滤器来根据日期查询datetime对象。因此,它将很快在1.9中可用。

下面是我使用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似乎更快。

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的datetime对象,因此数据库中的时间不匹配。

您可以在某些日期范围之间进行筛选

2016-01-01 00:00:00 <- > 2016-04-01 23:59:59.99999. 2016-01-01 00:00:00 <- > 2016-04-01 23:59:59.99999

User.objects.filter(date_joined__gte=datetime.combine(datetime.strptime('2016- 
01-01', '%Y-%d-%m'), datetime.min.time()), 
date_joined__lte=datetime.combine(datetime.strptime('2016-04-01', '%Y-%d-%m'), 
datetime.max.time())).count()

2016-01-01 00:00:00 <- > 2016-01-14 00:00:00. 2016-01-01 00:00:00 <- > 2016-01-14 00:00:00

User.objects.filter(date_joined__gte='2016-01-01', date_joined__lte='2016-1-14').count()
Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)