You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:05:31