【问题标题】:Filtering wrong using a timestamp range in django views在 django 视图中使用时间戳范围过滤错误
【发布时间】:2020-09-19 00:13:24
【问题描述】:

当我想使用一个确切的日期过滤我的模型时,我使用以下代码行,

today = datetime.datetime.now().date()
today_data = DevData.objects.filter(data_timestamp__date=today)

当我想使用日期范围进行过滤时,我使用以下代码行,

last7days = datetime.datetime.now().date() - datetime.timedelta(days=7)
last7days_data = DevData.objects.filter(data_timestamp__range=(last7days,today))

问题是当我使用第二个代码时,出现警告并且运行非常缓慢,

RuntimeWarning:在时区支持处于活动状态时,DateTimeField DevData.data_timestamp 收到了一个幼稚的日期时间 (2020-05-31 00:00:00)。

我怎样才能做得更好?

我找到了这个post,但不明白如何解决它。有人可以帮帮我吗?

【问题讨论】:

    标签: python django django-views timestamp


    【解决方案1】:

    您会看到一条警告,因为 last7days 变量不支持时区。

    你可以像这样让它感知时区:

    import datetime
    from datetime import timezone
    
    unaware = datetime.datetime(2020, 1, 1, 1, 1, 1, 1)
    aware = unaware.replace(tzinfo=timezone.utc))
    

    【讨论】:

      【解决方案2】:

      它运行相当慢的事实可能是因为您没有在data_timestamp字段上设置数据库索引,您可以通过指定db_index=True parameter [Django-doc]来添加:

      class DevData(models.Data):
          data_timestamp = models.DateTimeField(db_index=True)
          # …

      您还可以通过在查询中添加__date lookup [Django-doc] 来过滤数据:

      last7days = datetime.datetime.now().date() - datetime.timedelta(days=7)
      last7days_data = DevData.objects.filter(
          data_timestamp__date__range=(last7days,today)
      )

      【讨论】:

        猜你喜欢
        • 2017-08-05
        • 1970-01-01
        • 2016-02-21
        • 2020-05-10
        • 2011-03-03
        • 1970-01-01
        • 2020-05-31
        • 2015-04-10
        • 2018-05-15
        相关资源
        最近更新 更多