代码之家  ›  专栏  ›  技术社区  ›  ViaTech

Django筛选器日期范围ORM问题

  •  0
  • ViaTech  · 技术社区  · 6 年前

    我很难弄清楚我在这里哪里出错了。我请求在一个日期范围为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年2月7日12:07:59.72546-08

    8)未选择 2019年2月11日08:58:27.561245-08

    9)未选择 2019年2月11日09:03:35.063078-08

    2 回复  |  直到 6 年前
        1
  •  3
  •   Nikolas Stevenson-Molnar    6 年前

    有可能您的筛选日期与存储在数据库中的日期的时区不同。

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

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

        2
  •  0
  •   gregor2004ua    6 年前

    结束日期为UTC时区,但数据库中的记录已本地化为服务器的时区。取决于服务器的时区 2019-02-11 10:26:16.235354+00:00 实际上是不同的,例如纽约 2019-02-11 05:26:16.235354+00:00 .

    移除 .replace(tzinfo=pytz.UTC) 从开始和结束日期开始,你应该表现得很好。