【问题标题】:Django strict checking for aware timestampsDjango 严格检查感知时间戳
【发布时间】:2021-05-06 05:29:59
【问题描述】:

在 Django 中,如果您有 USE_TZ = True 并将天真的日期时间传递给数据库调用,它会记录错误:

DateTimeField Model.field 在时区支持处于活动状态时收到一个简单的日期时间 (2021-01-01 00:00:00)。

然而,Django 使用settings.TIME_ZONE 继续执行操作。有没有办法进行更严格的检查?是否有设置让 Django 引发异常而不仅仅是记录警告?

【问题讨论】:

    标签: python django timezone django-timezone


    【解决方案1】:

    至少从 Django 3.1 开始,没有这样的选项。

    例如,DateTimeField 中的一条relevant code 如下:

    def get_prep_value(self, value):
        value = super().get_prep_value(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.
            try:
                name = '%s.%s' % (self.model.__name__, self.name)
            except AttributeError:
                name = '(unbound)'
            warnings.warn("DateTimeField %s received a naive datetime (%s)"
                          " while time zone support is active." %
                          (name, value),
                          RuntimeWarning)
            default_timezone = timezone.get_default_timezone()
            value = timezone.make_aware(value, default_timezone)
        return value
    

    您可以通过创建 DateTimeField 的子类并覆盖方法 get_prep_valueto_python 来引发异常而不是记录警告来获得所需的行为。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 2019-01-02
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 2018-08-20
      • 2016-09-28
      相关资源
      最近更新 更多