如何在Django中过滤日期范围的查询对象?

375 投票
8 回答
509164 浏览
提问于 2025-04-16 09:50

我在一个模型里有一个字段,内容是这样的:

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(大于/小于)来进行过滤。

撰写回答