【问题标题】:DateTimeField received a naive datetimeDateTimeField 收到一个天真的日期时间
【发布时间】:2014-01-29 02:31:41
【问题描述】:

我有带有 DateTimeField 列的模型。

我正在尝试通过 sql 查询将具有数据库 current_time 值的行直接插入到表中。

我对 MySQL 数据库的 sql 查询如下:

INSERT INTO MyTable (..., my_datetime, ...) VALUES (..., current_time, ...)

得到:

RuntimeWarning: DateTimeField ModelName.field_name 收到一个幼稚的 datetime (2014-01-09 22:16:23) 时区支持处于活动状态。

如何通过sql查询将当前时间直接插入表中而不提示?

【问题讨论】:

标签: python mysql django datetime django-timezone


【解决方案1】:

您还可以使用pytz 中的localize 使日期时区感知,如here 所述。

世界标准时间:

import pytz
dt_aware = pytz.utc.localize(dt_naive)

任何其他时区:

import pytz
tz = 'Europe/Berlin' #or whaterver timezone you want
dt_aware = pytz.timezone(tz).localize(dt_naive)

还有here 时区列表。

【讨论】:

    【解决方案2】:

    对于 falsetru 的回答,如果日期时间已经创建,您可以将其转换为时区感知:

    from django.utils import timezone
    my_datetime = timezone.make_aware(my_datetime, timezone.get_current_timezone())
    

    【讨论】:

    • 我找不到 datetime.datetime.combine() 的时区感知替代方法(创建范围以仅按日期过滤 DateTimeFields),这很好用
    【解决方案3】:

    使用django.utils.timezone.now 代替datetime.datetime.now

    from django.utils import timezone
    current_time = timezone.now()
    

    【讨论】:

    • 我需要直接在数据库中进行sql查询。不在 django 中。
    • @Andrei:我不认为你这样做。警告来自 django,而不是数据库。如果您使用 falsetru 描述的方法创建my_datetime,则不会生成警告
    • @hellsgate 我知道这个警告来自 django,而不是来自数据库。但我的目标是使用 sql 查询插入行,而不是使用带有默认字段 django.utils.timezone.now 的 django 模型创建新对象。
    • @Andrei:很公平。这对您来说仍然是一个很好的答案,因为确保 current_time 是 tz 感知将在您构建 SQL 查询时防止该警告
    猜你喜欢
    • 2014-03-28
    • 2019-08-06
    • 2021-01-27
    • 1970-01-01
    • 2012-09-23
    • 2013-09-08
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多