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
相关产品推荐
相关产品推荐

