【问题标题】:Django model time stamp range filterDjango 模型时间戳范围过滤器
【发布时间】:2016-12-08 06:17:13
【问题描述】:

我有一个模型字段time_stamp = models.DateTimeField(timezone.now)。现在我想根据日期范围进行搜索,比如 2016-11-08 到 2016-12-08。我该怎么做。

【问题讨论】:

标签: python django django-models django-orm


【解决方案1】:

来自range查找的文档:

过滤带有日期的 DateTimeField 不会包括最后一天的项目,因为边界被解释为“给定日期的凌晨 0 点”。

考虑到这一点,如果您想要上一个日期的项目,即2016-12-08,您可以考虑在过滤中使用2016-12-09

import datetime
start_date = datetime.date(2016, 11, 8)
# use the day after 2016-12-08 to include it
end_date = datetime.date(2016, 12, 9)
Model.objects.filter(time_stamp__range=(start_date, end_date))

或者,使用gtelte 查找:

import datetime
start_date = datetime.date(2016, 11, 8)
end_date = datetime.date(2016, 12, 8)
Model.objects.filter(time_stamp__gte=start_date, time_stamp__lte=end_date))

【讨论】:

    【解决方案2】:

    https://docs.djangoproject.com/en/1.10/ref/models/querysets/#range

    import datetime
    start_date = datetime.date(2005, 1, 1)
    end_date = datetime.date(2005, 3, 31)
    Entry.objects.filter(pub_date__range=(start_date, end_date))
    

    【讨论】:

      【解决方案3】:
      Model.objects.filter(time_stamp__range=["2016-11-08", "2016-12-08"])
      

      链接Django database query: How to filter objects by date range?

      【讨论】:

        【解决方案4】:

        如果您的 django 版本 >= 1.9,您可以在日期时间字段上使用 date 强制转换。

        Model.objects.filter(time_stamp__date__gte=start_date, time_stamp__date__lte=end_date)
        

        这也会考虑时区转换。其他答案的问题是他们没有考虑在 datetime 字段上进行过滤。

        Django 文档:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#date

        【讨论】:

          猜你喜欢
          • 2017-08-05
          • 2011-03-03
          • 2018-09-29
          • 1970-01-01
          • 2020-05-31
          • 2020-09-19
          • 2017-05-26
          • 1970-01-01
          • 2018-05-15
          相关资源
          最近更新 更多