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

Xid*_*bix 159 python django datetime filter django-queryset

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

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Run Code Online (Sandbox Code Playgroud)

我得到一个空的查询集列表作为答案因为(我认为)我不考虑时间,但我想"随时".

Django有这么简单的方法吗?

我有时间在日期时间设置,但事实并非如此00:00.

Pio*_*pla 109

这样的查找实现django.views.generic.date_based如下:

{'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
                            datetime.datetime.combine(date, datetime.time.max))} 
Run Code Online (Sandbox Code Playgroud)

因为它非常冗长,所以有计划使用__dateoperator 改进语法.有关详细信息,请查看" #9596将DateTimeField与日期进行比较太难 ".

  • Django 1.9中的新功能:`Entry.objects.filter(pub_date__date = datetime.date(2005,1,1))` (11认同)
  • 看起来它将落在Django 1.9:https://github.com/django/django/commit/44f3ee77166bd5c0e8a4604f2d96015268dce100#diff-5e313dd49d68a0a867d830a7f442d2a6R2471 (10认同)
  • 使用范围:`Q(created__gte = datetime.combine(created_value,time.min))` (4认同)

zal*_*lew 95

YourModel.objects.filter(datetime_published__year='2008', 
                         datetime_published__month='03', 
                         datetime_published__day='27')
Run Code Online (Sandbox Code Playgroud)

//评论后编辑

YourModel.objects.filter(datetime_published=datetime(2008, 03, 27))
Run Code Online (Sandbox Code Playgroud)

doest无法工作,因为它创建了一个日期时间对象,其时间值设置为0,因此数据库中的时间不匹配.


Mor*_*eno 84

以下是我使用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
Run Code Online (Sandbox Code Playgroud)

包含似乎更快.

  • __contains方法对我来说很好.我认为这可能是最好的答案,因为它提供了性能比较.我投了不止一票,但我很惊讶它没有更多的赞成票. (3认同)

小智 43

Mymodel.objects.filter(date_time_field__contains=datetime.date(1986, 7, 28))
Run Code Online (Sandbox Code Playgroud)

以上是我用过的.它不仅有效,而且还有一些固有的逻辑支持.

  • 比这里的所有其他答案好多了,谢谢! (3认同)

oma*_*mat 41

现在Django有__date查询过滤器来查询日期时间对象与开发版本中的日期.因此,它将很快在1.9中提供.


And*_* B. 27

从Django 1.9开始,这样做的方法是使用__datedatetime对象.

例如: MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))


mho*_*ost 25

这产生与使用__year,__ month和__day相同的结果,似乎对我有用:

YourModel.objects.filter(your_datetime_field__startswith=datetime.date(2009,8,22))
Run Code Online (Sandbox Code Playgroud)

  • 看起来这个将date对象转换为字符串并对日期进行字符串比较,因此强制db进行全表扫描.对于大桌来说,这个会破坏你的表现 (19认同)

jee*_*u94 9

你可以这样做

MyObject.objects.filter(datetime_field__date=datetime.date(2009,8,22))
Run Code Online (Sandbox Code Playgroud)

或者如果您想在 2 个日期之间进行过滤

MyObject.objects.filter(
    datetime_field__date__range=(datetime.date(2009,8,22), datetime.date(2009,9,22))
)
Run Code Online (Sandbox Code Playgroud)


dav*_*411 8

假设active_on是一个日期对象,将其递增1天然后执行范围

next_day = active_on + datetime.timedelta(1)
queryset = queryset.filter(date_created__range=(active_on, next_day) )
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以按日期进行过滤,因为日期格式与您的 django 日期格式相同。默认格式为 ISO YYYY-MM-DD

target_date = "2009-08-22"
qs = MyObject.objects.filter(datetime_attr__date=target_date)
Run Code Online (Sandbox Code Playgroud)