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