Django数据库查询:如何按date范围过滤对象?

我有一个像一个模型的领域

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

现在,我需要通过数据范围过滤对象,例如2011年1月1日至2011年1月31日之间的所有对象。

谢谢你的帮助!

使用

 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你应该考虑他的解决scheme ,它利用了gt / lt(大于/小于)。

你可以用datetime.date对象来使用django的filter

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

当使用filter做Django范围时,确保知道使用date对象与date时间对象之间的区别。 __range在date中是包含的,但是如果您使用datetime对象作为结束date,那么如果没有设置时间,它将不包括那一天的条目。

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

返回从startdate到enddate的所有条目,包括这些date中的条目。 不好的例子,因为这是一个回到未来一周的条目,但你得到的漂移。

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

将根据date字段的设置时间缺less24小时值。

您可以解决由于DateTimeField/date对象比较中缺less精度而导致的“阻抗不匹配”问题 – 如果使用范围 ,则可能发生这种情况 – 通过使用datetime.timedeltadate添加到范围中的最后一个date。 这工作如下:

 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]) 

正如前面所讨论的,没有这样做,logging在最后一天被忽略。

编辑,以避免使用datetime.combine – 似乎更符合date实例与DateTimeField比较时,而不是乱七八糟的关于一次性(和令人困惑的) datetime对象。 请参阅下面的评论进一步的解释

为我工作

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