Django ORM以错误的时间执行查询?



我正在尝试根据日期时间字段获取数据!我为此编写了以下脚本:

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:0015: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

溶液:

您可以将 MySql 数据存储在 UTC 时区中,如果现有数据位于Kolkata时区中,请通过减去-5:30运行更新查询,并将所有新数据保存在 UTC 时区。

如果您的应用程序不需要支持多个时区,您可以将应用程序时区更改为UTC。这是快速的解决方案,但不是一个好主意,因为时区信息被截断了。

简而言之

  1. Django 将存储 UTC 保存在数据库中。
  2. 如果您没有提及时区,则会采用您在 settings.py 中提到的时区(在您的情况下,采用Asia/Kolkata,因此make_aware函数假设您正在输入时区Asia/Kolkata的日期时间。但如步骤 1 中所述,它被保存为 UTC。两个时间指向同一时间 - 也就是说,UTC和亚洲/加尔各答描述的时间相同(。
  3. 除了 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((,它对我有用。对于这个第一个你需要导入时区,从django.utils导入时区 https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/

最新更新