【问题标题】:DateTimeField received a naive datetime while time zone support is active在时区支持处于活动状态时,DateTimeField 收到了一个简单的日期时间
【发布时间】:2012-07-18 10:01:55
【问题描述】:

Django 给了我一些运行时警告(关于我没有编写的代码)。

我怎样才能让 Django 给我一个堆栈跟踪,以便我可以看到是什么导致了这些?

/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py:808: 
RuntimeWarning: DateTimeField received a naive datetime (2012-07-19 09:36:16.161479) 
while time zone support is active.
  RuntimeWarning

【问题讨论】:

    标签: django


    【解决方案1】:

    来自文档:https://docs.djangoproject.com/en/stable/topics/i18n/timezones/#code

    在开发过程中,您可以通过将以下内容添加到您的设置文件中,将此类警告转化为异常并获取回溯:

    import warnings
    warnings.filterwarnings(
        'error', r"DateTimeField .* received a naive datetime",
        RuntimeWarning, r'django\.db\.models\.fields')
    

    【讨论】:

      【解决方案2】:

      您可以使用traceback.print_exception() 实现您的日志格式化程序并在日志中追溯警告消息。

      请参阅 FormatException 的 Fomatter 文档

      你也可以参考这个,How do I use Django's logger to log a traceback when I tell it to?

      【讨论】:

        【解决方案3】:

        这意味着您在 django 中启用了时区支持;但是您向它传递了一个没有附加任何时区信息的日期时间对象。

        如果你想要 django 的时区支持,那么使用的 datetime 对象应该是时区感知的。

        documentation on timezone support 提供了一种将您的日期时间对象转换为带有 timzeones 的方法。

        【讨论】:

        • 谢谢,但我知道这一点。我正在寻找导致运行时警告的原因。这不是唯一一个......
        【解决方案4】:

        Django 的源码告诉你刚刚发生了什么:

        def get_prep_value(self, value):
            value = self.to_python(value)
            if value is not None and settings.USE_TZ and timezone.is_naive(value):
                # For backwards compatibility, interpret naive datetimes in local
                # time. This won't work during DST change, but we can't do much
                # about it, so we let the exceptions percolate up the call stack.
                warnings.warn(u"DateTimeField received a naive datetime (%s)"
                              u" while time zone support is active." % value,
                              RuntimeWarning)
                default_timezone = timezone.get_default_timezone()
                value = timezone.make_aware(value, default_timezone)
            return value
        

        【讨论】:

        • 谢谢,但我知道这一点。我正在寻找导致运行时警告的原因。这不是唯一一个......
        猜你喜欢
        • 2020-10-13
        • 2020-09-19
        • 1970-01-01
        • 2020-06-19
        • 2018-05-14
        • 2016-10-03
        • 2019-07-23
        • 2014-12-03
        • 1970-01-01
        相关资源
        最近更新 更多