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)