如何将DRF中DateField默认格式从YYYY-MM-DD改为DD-MM-YYYY?
解决DRF中DateField POST请求格式不生效的问题
我懂你的痛点——你已经在序列化器里给schedule_date指定了format="%d-%m-%Y",发现列表接口返回数据时日期确实变成了DD-MM-YYYY,但用POST提交这个格式的日期时,DRF却不买账,还是默认要求YYYY-MM-DD对吧?这是因为DRF的DateField参数分工很明确:
format:只负责序列化输出(把数据库里的日期转成指定格式返回给前端)input_formats:才是控制反序列化输入(解析前端提交的日期字符串转成Date对象)的参数
解决方案1:单独给字段配置输入格式
直接修改你的ReminderSerializer,给schedule_date加上input_formats参数,明确告诉DRF可以接受DD-MM-YYYY格式的输入:
class ReminderSerializer(HyperlinkedModelSerializer): schedule_date = serializers.DateField( format="%d-%m-%Y", input_formats=["%d-%m-%Y", "%Y-%m-%d"] # 可选保留默认格式做兼容 ) class Meta: model = Reminder fields = ('id','content','created_at','schedule_date','schedule_time','user_id','is_release','is_deleted',)
这样设置后,DRF在处理POST请求时,会先尝试用%d-%m-%Y解析日期,如果失败再尝试默认的%Y-%m-%d,既满足你的需求,也保留了兼容性。
解决方案2:全局配置所有DateField
如果你希望项目里所有的DateField都统一使用DD-MM-YYYY的输入输出格式,可以在项目的settings.py里添加DRF的全局配置:
REST_FRAMEWORK = { # 统一输出格式 'DATE_FORMAT': '%d-%m-%Y', # 支持的输入格式列表 'DATE_INPUT_FORMATS': ['%d-%m-%Y', '%Y-%m-%d'] }
这样就不用每个序列化器都单独设置字段了,全局生效更省心。
验证一下
修改完成后,你可以测试POST请求,提交schedule_date=31-12-2024这样的格式,DRF应该能正确解析并存储到数据库里,同时接口返回的日期也会保持DD-MM-YYYY格式。
内容的提问来源于stack exchange,提问作者Jackquin
相关产品推荐
相关产品推荐

