如何配置DATETIME_INPUT_FORMATS使其支持timestamp格式输入?
问题根因
- 配置语法错误:你示例中
REST_FRAMEWORK使用了列表[]声明,实际应该为字典{},该语法错误会直接导致配置不生效。 %s格式输入兼容性差:Python标准库datetime.strptime对%s格式的支持仅适用于部分Unix平台,Windows环境完全不支持,所以直接配置DATETIME_INPUT_FORMATS = ["%s"]无法实现跨环境的时间戳输入解析。- 本地化配置冲突:如果项目
settings.py中开启了USE_L10N = True,DRF会优先加载本地化的日期时间格式,覆盖你自定义的全局输入输出配置。
无侵入解决方案(无需修改现有Serializer字段)
该方案通过全局替换DRF的模型字段映射规则实现,所有自动生成的ModelSerializer字段和手动声明的日期时间字段都会自动适配时间戳输入,无需修改现有业务代码。
步骤1:自定义支持时间戳输入的字段
新建fields.py文件,实现兼容时间戳输入的日期时间字段:
from datetime import datetime from django.db import models from rest_framework import serializers class TimestampDateTimeField(serializers.DateTimeField): def to_internal_value(self, value): # 适配10位秒级、13位毫秒级时间戳输入 if isinstance(value, (int, float, str)): try: timestamp = float(value) # 处理毫秒级时间戳 if len(str(int(timestamp))) == 13: timestamp /= 1000 return datetime.fromtimestamp(timestamp) except (ValueError, TypeError): pass # 非时间戳格式走原有解析逻辑,兼容其他输入格式 return super().to_internal_value(value) class TimestampDateField(serializers.DateField): def to_internal_value(self, value): if isinstance(value, (int, float, str)): try: timestamp = float(value) if len(str(int(timestamp))) == 13: timestamp /= 1000 return datetime.fromtimestamp(timestamp).date() except (ValueError, TypeError): pass return super().to_internal_value(value)
步骤2:全局配置字段映射与格式
修改settings.py,添加如下配置:
# 关闭本地化格式优先,避免覆盖自定义配置 USE_L10N = False REST_FRAMEWORK = { # 原有时间戳输出配置 "DATETIME_FORMAT": "%s", "DATE_FORMAT": "%s", # 全局替换日期时间字段映射 "FIELD_MAPPING": { **serializers.ModelSerializer.serializer_field_mapping, models.DateTimeField: TimestampDateTimeField, models.DateField: TimestampDateField, } }
配置完成后所有日期时间字段会自动支持时间戳输入,同时兼容原有其他格式的输入,输出保持时间戳格式不变。
内容的提问来源于stack exchange,提问作者FooBar
相关产品推荐
相关产品推荐

