如何在Django中过滤日期范围的查询对象?
我在一个模型里有一个字段,内容是这样的:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
现在,我需要根据日期范围来筛选这些对象。
我该怎么做才能找到所有日期在 2011年1月1日
和 2011年1月31日
之间的对象呢?
8 个回答
135
在使用Django进行范围查询时,要注意日期对象和日期时间对象之间的区别。__range这个功能在处理日期时是包含起止日期的,但如果你在结束日期使用了日期时间对象,而没有设置具体的时间,那么当天的记录就不会被包括在内。
from datetime import date, timedelta
startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
这个代码会返回从开始日期到结束日期之间的所有记录,包括这两个日期的记录。虽然这个例子不太好,因为它返回的是未来一周的记录,但你大概明白我的意思了。
from datetime import datetime, timedelta
startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
根据日期字段的时间设置,可能会缺少24小时的记录。
308
你可以使用 Django 的 filter
方法,配合 datetime.date
对象 来进行操作:
import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
sampledate__lte=datetime.date(2011, 1, 31))
593
使用
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
或者如果你只是想按月份过滤的话:
Sample.objects.filter(date__year='2011',
date__month='01')
编辑
正如Bernhard Vallant所说,如果你想要一个查询结果,排除掉指定的范围端点
,你可以考虑他的解决方案,这个方案使用了gt/lt(大于/小于)来进行过滤。