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

时间:2011-01-12 12:09:59

标签: python django django-models django-queryset

我在一个模型中有一个字段,如:

class Sample(models.Model):
    date = fields.DateField(auto_now=False)

现在,我需要按日期范围过滤对象。

如何过滤日期介于1-Jan-201131-Jan-2011之间的所有对象?

8 个答案:

答案 0 :(得分:335)

使用

Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])

或者,如果您只想过滤月份:

Sample.objects.filter(date__year='2011', 
                      date__month='01')

修改

正如Bernhard Vallant所说,如果你想要一个不包括specified range ends的查询集,你应该考虑his solution,它使用gt / lt(大于/小于)。

答案 1 :(得分:160)

您可以django's filter使用datetime.date objects

import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
                                sampledate__lte=datetime.date(2011, 1, 31))

答案 2 :(得分:73)

使用过滤器执行django范围时,请确保您知道使用日期对象与日期时间对象之间的区别。 __range包含日期,但如果您使用datetime对象作为结束日期,则如果未设置时间,则不包括该日期的条目。

    startdate = date.today()
    enddate = startdate + timedelta(days=6)
    Sample.objects.filter(date__range=[startdate, enddate])

返回从startdate到enddate的所有条目,包括那些日期的条目。不好的例子,因为这会在未来一周内返回条目,但是你会得到漂移。

    startdate = datetime.today()
    enddate = startdate + timedelta(days=6)
    Sample.objects.filter(date__range=[startdate, enddate])

将缺少24小时的条目,具体取决于日期字段的设置时间。

答案 3 :(得分:17)

您可以解决DateTimeField/date对象比较中缺乏精确度导致的“阻抗不匹配” - 如果使用范围,则可能会出现这种情况 - 使用 datetime.timedelta 可在范围内添加一天到最后一个日期。这就像:

start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)

ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])

如前所述,如果不做这样的事情,最后一天会忽略记录。

编辑以避免使用datetime.combine - 在与DateTimeField进行比较时坚持使用日期实例似乎更合乎逻辑,而不是弄乱一次性(和令人困惑的)datetime个对象。请参阅下面的评论中的进一步说明。

答案 4 :(得分:5)

很简单,

YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())

适合我

答案 5 :(得分:1)

您可以使用“ __range” 例如:

from datetime import datetime
start_date=datetime(2009, 12, 30)
end_end=datetime(2020,12,30)
Sample.objects.filter(date__range=[start_date,end_date])

答案 6 :(得分:0)

要使其更加灵活,可以设计如下的FilterBackend:

editor.model.document.on( 'mediaEmbed', () => {
   console.log('insert media')
} );

答案 7 :(得分:-1)

今天仍然有意义。 您也可以这样做:

import dateutil
import pytz

date = dateutil.parser.parse('02/11/2019').replace(tzinfo=pytz.UTC)