2

我有一个带有 DateTimeField 的 Django Rest Framework 序列化程序。默认情况下,它将使用 iso-8601 格式反序列化日期/时间值。但是,iso-8601 不需要时区偏移。我需要用户始终提供一些时区偏移信息(或者更好地说,再次验证 rfc 3339,iso-8601 的子集)。

该字段允许您设置 input_formats 的自定义列表,但由于 Python 无法正确解析 rfc 3339 格式的日期(即不支持在小时和分钟部分之间带有冒号的偏移量),我被卡住了。

4

1 回答 1

3

Django Rest Framework 中的 DateTimeField 完全能够解析 rfc 3339 日期时间值,这要归功于它的使用django.utils.dateparse.parse_datetime(它有点宽松,但没关系)。

parse_datetime要么返回一个时区感知的日期时间实例(使用 tzinfo zet 到一个固定的偏移量),要么返回一个天真的日期时间实例(没有 tzinfo)。

Django Rest Framework 的 DateTimeField 将任何给定值转换为可感知的日期时间值,如果settings.USE_TZ设置或该字段被赋予default_timezone参数值,否则任何值都是幼稚的。

DateTimeField的enforce_timezone方法负责使值感知/幼稚。

知道了这一点,如果解析的日期时间值是幼稚的,则可以通过覆盖enforce_timezone和提高 a来强制解析的值必须是时区感知的:ValidationError

from django.utils import timezone

class DateTimeFieldWithOffset(serializers.DateTimeField):
    default_error_messages = {
        'naive': 'Datetime value is missing a timezone offset.'
    }

    def enforce_timezone(self, value):
        if timezone.is_naive(value):
            self.fail('naive')
        return super().enforce_timezone(value)
于 2017-10-27T14:10:45.307 回答