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

如何配置DATETIME_INPUT_FORMATS使其支持timestamp格式输入?

问题根因

  1. 配置语法错误:你示例中REST_FRAMEWORK使用了列表[]声明,实际应该为字典{},该语法错误会直接导致配置不生效。
  2. %s格式输入兼容性差:Python标准库datetime.strptime对%s格式的支持仅适用于部分Unix平台,Windows环境完全不支持,所以直接配置DATETIME_INPUT_FORMATS = ["%s"]无法实现跨环境的时间戳输入解析。
  3. 本地化配置冲突:如果项目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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:36:07