Django 3.0.2序列化器DateTimeField时间格式验证错误排查
问题:Django序列化器日期格式验证失败排查
环境与序列化器代码
使用Django 3.0.2版本,定义了如下序列化器:
class ValueNestedSerializer(request_serializer.Serializer): lower = request_serializer.DateTimeField(required=True, allow_null=False, format=None, input_formats=['%Y-%m-%dT%H:%M:%SZ',]) upper = request_serializer.DateTimeField(required=True, allow_null=False, format=None, input_formats=['%Y-%m-%dT%H:%M:%SZ',]) class DateRangeSerializer(request_serializer.Serializer): attribute = request_serializer.CharField(default="UPLOAD_TIME") operator = request_serializer.CharField(default="between_dates") value = ValueNestedSerializer(required=True) timezone = request_serializer.CharField(default="UTC") timezoneOffset = request_serializer.IntegerField(default=0) class BaseQueryPayload(request_serializer.Serializer): appid = request_serializer.CharField(required=True, validators=[is_valid_appid]) filters = request_serializer.ListField( required=True, validators=[is_validate_filters], min_length=1 ) date_range = DateRangeSerializer(required=True)
请求载荷
传入的请求内容如下:
{ "appid": "6017cef554df4124274ef36d", "filters": [ { "table": "session", "label": "1month" } ], "date_range": { "value": { "lower": "2023-01-01T01:00:98Z", "upper": "2023-01-20T01:00:98Z" } }, "page": 1 }
验证错误信息
触发如下验证错误:
{ "error": { "date_range": { "value": { "lower": [ "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm:ssZ." ], "upper": [ "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm:ssZ." ] } } } }
问题原因与解决方法
你传入的日期秒数是98,但秒数的合法范围是00-59,这才是导致验证失败的核心原因。虽然提示信息指向格式问题,但实际是秒值超出了有效范围,Django的DateTimeField会将这种非法时间值判定为格式错误。
修正方法非常直接,把请求中的秒数改成00-59之间的合法数值即可,示例如下:
"lower": "2023-01-01T01:00:59Z", "upper": "2023-01-20T01:00:59Z"
如果后续需要更灵活的时间处理逻辑,也可以考虑给DateTimeField添加更多input_formats选项,或者自定义验证逻辑来兼容特殊场景,但当前问题只需修正秒数即可解决。
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

