代码之家  ›  专栏  ›  技术社区  ›  Zags

Django严格检查感知时间戳

  •  0
  • Zags  · 技术社区  · 5 年前

    在Django,如果你有 USE_TZ = True 并将原始日期时间传递给数据库调用,它会记录错误:

    DateTimeField模型。当时区支持处于活动状态时,字段收到原始日期时间(2021-01-01 00:00:00)。

    然而,Django继续进行操作,使用 settings.TIME_ZONE

    1 回复  |  直到 5 年前
        1
  •  0
  •   Zags    5 年前

    至少在Django 3.1中,没有这样的选项。

    例如,一块 relevant code 从DateTime字段可以看到以下内容:

    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
    

    get_prep_value to_python 引发异常而不是记录警告。