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

DRF Django如何在保存前修改值,适配带时间的ISO格式日期输入

解决方案

报错原因:Django REST Framework默认的DateField序列化字段仅支持YYYY-MM-DD格式的输入,你传入的是带时间信息的ISO 8601格式字符串,未通过字段格式校验。你可以通过以下两种方式修改序列化器配置即可兼容输入格式:

方法1:直接指定字段输入格式

修改PetSerializer,显式声明date_of_birth字段并添加支持的输入格式:

from rest_framework import serializers
from .models import Pet

class PetSerializer(serializers.ModelSerializer):
    date_of_birth = serializers.DateField(
        input_formats=['%Y-%m-%dT%H:%M:%S.%fZ', '%Y-%m-%d']
    )
    class Meta:
        model = Pet
        fields = "__all__"

这里input_formats里按优先级写你需要支持的所有输入格式,DRF会自动按顺序尝试解析输入值,提取日期部分存入数据库。

方法2:重写字段解析逻辑(更灵活)

如果后续还有其他自定义解析需求,可以重写序列化器的to_internal_value方法自行处理输入:

from rest_framework import serializers
from datetime import datetime
from .models import Pet

class PetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Pet
        fields = "__all__"

    def to_internal_value(self, data):
        # 处理date_of_birth字段格式
        if 'date_of_birth' in data:
            dob_str = data['date_of_birth']
            # 解析ISO格式的日期时间字符串
            try:
                dob_dt = datetime.strptime(dob_str, '%Y-%m-%dT%H:%M:%S.%fZ')
                # 仅保留日期部分
                data['date_of_birth'] = dob_dt.date()
            except ValueError:
                # 格式不匹配时抛出校验错误
                raise serializers.ValidationError({
                    'date_of_birth': ['Date has wrong format. Use format: YYYY-MM-DDThh:mm:ss.sssZ']
                })
        return super().to_internal_value(data)

两种方式都可以满足你接收2021-08-29T00:46:27.103Z格式输入的需求,修改后重新启动服务即可正常请求接口。

内容的提问来源于stack exchange,提问作者Santhosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:30:00