为什么我的带有简单日期时间的 Django ORM 查询返回与带有时区感知日期时间的 PostgreSQL 查询相同的结果?

问题描述 投票:0回答:1

我正在使用 Django 根据日期范围和简单的日期时间来过滤预订。我的 Django ORM 查询是:

start_d_date_naive = "2024-11-3 00:00"
end_d_date_naive = "2024-11-3 23:59"
reserve_naive = Reservations.objects.filter(
    updated_at__range=(start_d_date_naive, end_d_date_naive), status="canceled"
)

这将转换为以下 SQL 查询:

SELECT * FROM "consultant_reservations"
WHERE "consultant_reservations"."status" = 'canceled'
AND "consultant_reservations"."updated_at" BETWEEN '2024-11-03 00:00:00' AND '2024-11-03 23:59:00'

但是,结果与我直接在 PostgreSQL 中运行此查询的结果相同:

SELECT * FROM "consultant_reservations"
WHERE updated_at BETWEEN '2024-11-03 00:00:00+03:30' AND '2024-11-03 23:59:00+03:30'
AND status='canceled';

为什么使用朴素日期时间的 Django ORM 查询返回与使用时区感知日期时间的 PostgreSQL 查询相同的结果?


settings.py 包含:

TIME_ZONE = 'Asia/Tehran'

USE_TZ = False

在 Django shell 中测试:

In [14]: from django.conf import settings

In [15]: print(settings.TIME_ZONE)
Asia/Tehran

PostgreSQL 服务器:

=> SHOW timezone;
 TimeZone 
----------
 Etc/UTC
(1 row)

包含 Django 项目的服务器是 Ubuntu 服务器:

$ timedatectl
               Local time: Tue 2024-11-05 12:25:58 UTC
           Universal time: Tue 2024-11-05 12:25:58 UTC
                 RTC time: Tue 2024-11-05 12:25:58
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
django postgresql datetime django-models orm
1个回答
0
投票

尝试,USE_TZ = True

如果我们使用 USE_TZ = False ,django 将不会应用时区。 在这里,您使用 USE_TZ = False 并将时区设置为“亚洲/德黑兰”

© www.soinside.com 2019 - 2024. All rights reserved.