我有一个带有DateTimeField的Django Rest Framework序列化程序。默认情况下,它将使用iso-8601格式反序列化日期/时间值。但是,iso-8601不需要时区偏移。我需要用户始终提供一些时区偏移信息(或更好地说,再次验证rfc 3339,iso-8601的子集)。
该字段允许您设置input_formats的自定义列表,但由于Python无法正确解析rfc 3339格式的日期(即不支持小时和分钟部分之间冒号的偏移)我被卡住了。
答案 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)