有没有办法让 Django 接受带有 USE_TZ=True 的原始日期时间,或者抑制警告?
Is there a way for Django to accept naive datetimes with USE_TZ=True, or to suppress warnings?
我们公司一直是 Django 的长期用户 -- 超过 10 年。我们目前是 运行 Django 1.11.26。多年来,我们处理了很多与日期时间相关的问题,但事实证明我们当前的问题具有挑战性。
我们的目标是做到以下几点:
- 使用 Django 的时区支持(设置 USE_TZ=True)并将 UTC 作为默认时区
- 对于几个非规范化字段(能源数据的每日汇总)存储原始日期时间
如许多 Stack Overflow 问题中所述,Django 将发出警告,其中日期时间字段值设置为原始日期时间:
RuntimeWarning:DateTimeField 收到一个天真的日期时间...而时区支持处于活动状态。
我们认为我们存储原始日期时间的用例是合理的。虽然对于我们几乎所有的日期时间字段,使用 UTC 是有意义的,但对于某些类型的每日汇总,我们希望存储一个 naive/agnostic 日期时间,指示本地时区中一天的开始日期时间(不同对象的多个时区).通过使用简单的日期时间,我们能够使用与日期时间相关的过滤器。因此,如果我们要汇总给定日期时间的某些类型的能源汇总,我们可以通过以各种方式过滤该原始本地日期时间来找到任何时区(洛杉矶、芝加哥、波士顿)建筑物的相同本地日期时间的汇总。
以下是我们尝试过的一些方法:
- 将 local/naive 日期时间保存为具有给定本地时区的感知日期时间。这是行不通的,因为 Django 将始终转换为等效的 UTC。我们可以理解为什么会发生这种情况,部分原因是 MySQL 5.6 DATETIME 字段不支持时区。
- 使用 override_settings(USE_TZ=False) 覆盖汇总模型的保存方法。这确实会抑制有关原始日期时间的运行时警告,但它会强制将模型中的所有日期时间保存为原始日期时间。它看起来很老套,因为 override_settings 用于测试。
我们现在唯一的解决方法是告诉 Django 这个 loca/naive 日期时间字段是 UTC——因此在保存时不会进行时间转换,也不会发出运行时警告,因为它是一个感知日期时间。但它最终是错误的。这些不是 UTC 日期时间。它们是故意天真、非规范化的日期时间。我们担心这会影响到我们,尤其是当 Django 发展其时区支持时。
对于这个问题,还有没有我们没有考虑过的其他可能的解决方案?预先感谢您考虑这个问题。
要过滤或抑制警告,您可以使用 warnings.filterwarnings
:
您可以尝试将类似这样的内容添加到 settings.py 以过滤警告:
from warnings import filterwarnings
filterwarnings('ignore', message=r'.*received a naive datetime')
您可能需要 fiddle 调用 filterwarnings
以根据需要抑制警告。
我们公司一直是 Django 的长期用户 -- 超过 10 年。我们目前是 运行 Django 1.11.26。多年来,我们处理了很多与日期时间相关的问题,但事实证明我们当前的问题具有挑战性。
我们的目标是做到以下几点:
- 使用 Django 的时区支持(设置 USE_TZ=True)并将 UTC 作为默认时区
- 对于几个非规范化字段(能源数据的每日汇总)存储原始日期时间
如许多 Stack Overflow 问题中所述,Django 将发出警告,其中日期时间字段值设置为原始日期时间: RuntimeWarning:DateTimeField 收到一个天真的日期时间...而时区支持处于活动状态。
我们认为我们存储原始日期时间的用例是合理的。虽然对于我们几乎所有的日期时间字段,使用 UTC 是有意义的,但对于某些类型的每日汇总,我们希望存储一个 naive/agnostic 日期时间,指示本地时区中一天的开始日期时间(不同对象的多个时区).通过使用简单的日期时间,我们能够使用与日期时间相关的过滤器。因此,如果我们要汇总给定日期时间的某些类型的能源汇总,我们可以通过以各种方式过滤该原始本地日期时间来找到任何时区(洛杉矶、芝加哥、波士顿)建筑物的相同本地日期时间的汇总。
以下是我们尝试过的一些方法:
- 将 local/naive 日期时间保存为具有给定本地时区的感知日期时间。这是行不通的,因为 Django 将始终转换为等效的 UTC。我们可以理解为什么会发生这种情况,部分原因是 MySQL 5.6 DATETIME 字段不支持时区。
- 使用 override_settings(USE_TZ=False) 覆盖汇总模型的保存方法。这确实会抑制有关原始日期时间的运行时警告,但它会强制将模型中的所有日期时间保存为原始日期时间。它看起来很老套,因为 override_settings 用于测试。
我们现在唯一的解决方法是告诉 Django 这个 loca/naive 日期时间字段是 UTC——因此在保存时不会进行时间转换,也不会发出运行时警告,因为它是一个感知日期时间。但它最终是错误的。这些不是 UTC 日期时间。它们是故意天真、非规范化的日期时间。我们担心这会影响到我们,尤其是当 Django 发展其时区支持时。
对于这个问题,还有没有我们没有考虑过的其他可能的解决方案?预先感谢您考虑这个问题。
要过滤或抑制警告,您可以使用 warnings.filterwarnings
:
您可以尝试将类似这样的内容添加到 settings.py 以过滤警告:
from warnings import filterwarnings
filterwarnings('ignore', message=r'.*received a naive datetime')
您可能需要 fiddle 调用 filterwarnings
以根据需要抑制警告。