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.timedelta将date添加到范围中的最后一个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())