Django ORM 以错误的时间执行查询?
Django ORM executes query with wrong time?
我正在尝试根据 DateTime 字段获取数据!我为此编写了以下脚本:
import datetime as dt
from dasboard.models import Visionsystem
from django.utils.timezone import make_aware
min_dt = dt.datetime.combine(dt.date.today(), dt.time(7, 15))
max_dt = dt.datetime.combine(dt.date.today(), dt.time(15, 44))
# Changing format for Django
min_dt_aware = make_aware(min_dt)
max_dt_aware = make_aware(max_dt)
# Fetching all the data between 7:15:00 to 15:44:00 for current day
l1 = Visionsystem.objects.filter(start_datetime__range=(min_dt_aware, max_dt_aware))
print(l1) 产生 空列表 并检查 str(l1.query) 给出:
'SELECT `visionsystem`.`id`, `visionsystem`.`Start_Datetime` ... FROM `visionsystem` WHERE
`visionsystem`.`Start_Datetime` BETWEEN 2019-10-16 01:45:00 AND 2019-10-16 10:14:00'
所需查询为:
'SELECT `visionsystem`.`id`, `visionsystem`.`Start_Datetime` ... FROM `visionsystem` WHERE
`visionsystem`.`Start_Datetime` BETWEEN 2019-10-16 07:15:00 AND 2019-10-16 15:44:00'
我不明白为什么 Django-ORM 使用 不同的时间进行查询 那么指定的内容是什么?
我的时区设置(在 settings.py 中):
TIME_ZONE = 'Asia/Kolkata'
USE_I18N = True
USE_L10N = True
USE_TZ = True
如何解决这个问题,从 7:15:00 到 15:44:00 获取所需的数据,对于今天 ?注意:我正在使用 MySQL 数据库!!
models.py 文件:
from django.db import models
class Visionsystem(models.Model):
start_datetime = models.DateTimeField(db_column='Start_Datetime', blank=True, null=True)
class Meta:
managed = False
db_table = 'visionsystem'
MySql 不支持时区,它以 UTC 格式存储日期时间,而您的 django
申请时区是 Asia/Kolkata
(UTC +5:30)。
在这里,django 在查询 MySQL 数据库之前自动将您的应用程序时区转换为 UTC。这是有道理的,因为当您使用 django 应用程序保存数据时,它会将日期时间转换为 UTC 时间,因此 07:15:00 Kolkata
时间将以 UTC 格式存储为 01:45:00
。
解法:
您可以在 UTC 时区存储 MySql 数据,如果现有数据在 Kolkata
时区,运行 通过减去 -5:30
更新查询并将所有新数据保存在UTC 时区。
或
如果您的应用程序不需要支持多时区,您可以将应用程序时区更改为UTC
。这是一个快速的解决方案,但不是一个好主意,因为时区信息是 t运行cated.
简而言之
- Django 在数据库中保存存储 UTC。
- 如果你没有提到时区,你在 settings.py 中提到的时区被采用(在你的情况下,
Asia/Kolkata
被采用,所以 make_aware 函数假设,你是输入带时区 Asia/Kolkata
的日期时间。但如步骤 1 中所述,它保存为 UTC。两个时间指向同一时间 - 即 UTC 和 Asia/Kolkata 描述的时间相同)。
- 除了 1 和 2 之外,django 将您的 timezone_aware 日期时间(即 min_dt_aware 和 max_dt_aware)转换为 UTC,以确保查询执行期间的正确性.
这里有详细的解释。
时区概览
启用时区支持后,Django 将 UTC 日期时间信息存储在数据库中,在内部使用时区感知日期时间对象,并在模板和表单中将它们转换为最终用户的时区.
值显示为 UTC,打印在 SQL 查询中:
import pytz
utc = pytz.UTC
# Print the utc value of min_dt_aware and max_dt_aware
print(min_dt_aware.astimezone(utc), max_dt_aware.astimezone(utc))
# So, as you can see, these utc values are which you see in SQL queries.
您可以使用 timezone.now(),它对我有用。为此,您首先需要导入时区,from django.utils import timezone https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/
我正在尝试根据 DateTime 字段获取数据!我为此编写了以下脚本:
import datetime as dt
from dasboard.models import Visionsystem
from django.utils.timezone import make_aware
min_dt = dt.datetime.combine(dt.date.today(), dt.time(7, 15))
max_dt = dt.datetime.combine(dt.date.today(), dt.time(15, 44))
# Changing format for Django
min_dt_aware = make_aware(min_dt)
max_dt_aware = make_aware(max_dt)
# Fetching all the data between 7:15:00 to 15:44:00 for current day
l1 = Visionsystem.objects.filter(start_datetime__range=(min_dt_aware, max_dt_aware))
print(l1) 产生 空列表 并检查 str(l1.query) 给出:
'SELECT `visionsystem`.`id`, `visionsystem`.`Start_Datetime` ... FROM `visionsystem` WHERE
`visionsystem`.`Start_Datetime` BETWEEN 2019-10-16 01:45:00 AND 2019-10-16 10:14:00'
所需查询为:
'SELECT `visionsystem`.`id`, `visionsystem`.`Start_Datetime` ... FROM `visionsystem` WHERE
`visionsystem`.`Start_Datetime` BETWEEN 2019-10-16 07:15:00 AND 2019-10-16 15:44:00'
我不明白为什么 Django-ORM 使用 不同的时间进行查询 那么指定的内容是什么?
我的时区设置(在 settings.py 中):
TIME_ZONE = 'Asia/Kolkata'
USE_I18N = True
USE_L10N = True
USE_TZ = True
如何解决这个问题,从 7:15:00 到 15:44:00 获取所需的数据,对于今天 ?注意:我正在使用 MySQL 数据库!!
models.py 文件:
from django.db import models
class Visionsystem(models.Model):
start_datetime = models.DateTimeField(db_column='Start_Datetime', blank=True, null=True)
class Meta:
managed = False
db_table = 'visionsystem'
MySql 不支持时区,它以 UTC 格式存储日期时间,而您的 django
申请时区是 Asia/Kolkata
(UTC +5:30)。
在这里,django 在查询 MySQL 数据库之前自动将您的应用程序时区转换为 UTC。这是有道理的,因为当您使用 django 应用程序保存数据时,它会将日期时间转换为 UTC 时间,因此 07:15:00 Kolkata
时间将以 UTC 格式存储为 01:45:00
。
解法:
您可以在 UTC 时区存储 MySql 数据,如果现有数据在 Kolkata
时区,运行 通过减去 -5:30
更新查询并将所有新数据保存在UTC 时区。
或
如果您的应用程序不需要支持多时区,您可以将应用程序时区更改为UTC
。这是一个快速的解决方案,但不是一个好主意,因为时区信息是 t运行cated.
简而言之
- Django 在数据库中保存存储 UTC。
- 如果你没有提到时区,你在 settings.py 中提到的时区被采用(在你的情况下,
Asia/Kolkata
被采用,所以 make_aware 函数假设,你是输入带时区Asia/Kolkata
的日期时间。但如步骤 1 中所述,它保存为 UTC。两个时间指向同一时间 - 即 UTC 和 Asia/Kolkata 描述的时间相同)。 - 除了 1 和 2 之外,django 将您的 timezone_aware 日期时间(即 min_dt_aware 和 max_dt_aware)转换为 UTC,以确保查询执行期间的正确性.
这里有详细的解释。
时区概览
启用时区支持后,Django 将 UTC 日期时间信息存储在数据库中,在内部使用时区感知日期时间对象,并在模板和表单中将它们转换为最终用户的时区.
值显示为 UTC,打印在 SQL 查询中:
import pytz
utc = pytz.UTC
# Print the utc value of min_dt_aware and max_dt_aware
print(min_dt_aware.astimezone(utc), max_dt_aware.astimezone(utc))
# So, as you can see, these utc values are which you see in SQL queries.
您可以使用 timezone.now(),它对我有用。为此,您首先需要导入时区,from django.utils import timezone https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/