如何让Django Rest Framework DateTimeField需要时区信息?

时间:2017-10-26 09:20:16

标签: django-rest-framework rfc3339

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

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

1 个答案:

答案 0 :(得分:0)

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并提升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)