【问题标题】:Django Filter Date Range ORM IssueDjango过滤日期范围ORM问题
【发布时间】:2019-07-05 07:59:32
【问题描述】:

我在搞清楚哪里出了问题时遇到了一些麻烦。我正在尝试在日期范围为 15 天的数据库中收集条目,但我的查询未选择正确的选项。

这是我的代码的重要部分:

start = datetime.now().replace(tzinfo=pytz.UTC) - timedelta(days=15)
end = datetime.now().replace(tzinfo=pytz.UTC)
# 2019-01-27 10:26:16.235354+00:00 | 2019-02-11 10:26:16.235354+00:00
print(start, '|', end)

completed_work_orders = WorkOrders.objects.using(db_alias).filter(
    unit_id=int(resident.unit_id),
    resident_dismissed=1).filter(date_created__range=[start, end]).order_by('-date_created')

这给了我: completed: <QuerySet [<WorkOrders: WorkOrders object (7)>]>

这里我只选择了应该选择 3 的行,这是我的 date_created 第 7、8 和 9 行的值,只选择了第 7 行:

7) 入选 2019-02-07 12:07:59.72546-08

8) 未选中 2019-02-11 08:58:27.561245-08

9) 未选中 2019-02-11 09:03:35.063078-08

【问题讨论】:

  • 如果你几个小时前没有写这个,你就有一个时区偏移。
  • @Klaus D. 我把系统时间改回来了,所以它是同步的,选择问题仍然存在。这确实看起来像其他问题的问题,但没关系。
  • 对于 Django,您应该始终使用 django.utils.timezone.now() 而不是 datetime.now()。这样,您可以确保您将获得与项目时区相匹配的日期,然后该日期应该与存储在数据库中的日期时间相匹配。 docs.djangoproject.com/en/2.1/topics/i18n/timezones/…
  • @NikolasStevenson-Molnar,这实际上解决了我的问题!
  • 太棒了!我会把它变成一个答案。

标签: python django datetime django-filter


【解决方案1】:

您最终过滤的日期可能与存储在数据库中的时区不同。

对于 Django,您应该始终使用 django.utils.timezone.now() 而不是 datetime.now()。这样,您可以确保您获得的日期与您项目的时区相匹配,然后应该与存储在数据库中的日期时间相匹配。

更多信息:https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/#naive-and-aware-datetime-objects

【讨论】:

    【解决方案2】:

    您的结束日期采用 UTC 时区,但您数据库中的记录已本地化为您服务器的时区。根据您服务器的时区,2019-02-11 10:26:16.235354+00:00 的结束日期实际上会有所不同,例如对于 NY,它将是 2019-02-11 05:26:16.235354+00:00

    从开始日期和结束日期中删除.replace(tzinfo=pytz.UTC),你应该会很好。

    【讨论】:

    • 当我这样做时,我会收到一个天真的日期时间警告。这不应该是问题。 RuntimeWarning: DateTimeField WorkOrders.date_created received a naive datetime (2019-01-27 14:13:50.546234) while time zone support is active. RuntimeWarning)
    猜你喜欢
    • 2013-11-26
    • 2020-03-09
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2012-12-16
    • 2014-11-17
    • 2021-11-27
    相关资源
    最近更新 更多