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

使用DRF处理POST请求时datetime格式匹配异常求助

问题:DRF处理POST请求时DateTimeField格式转换报错

使用Django REST Framework(DRF)处理api/reservations/接口的POST请求时,Django提示无法将字符串传入DateTimeField,尝试将字符串格式化为合法datetime类型,但即便时间字符串'2024-05-26 18:00'与指定格式'YYYY-MM-DD HH:mm'看起来完全一致,仍触发ValueError异常。

尝试过的操作:

  • 用JS修改datetime格式为"YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]."(末尾的点为格式一部分)
  • 使用django.utils.dateparse.parse_date方法,但该方法返回None,strptime仍报错

代码示例:

def create(self, validated_data):
  validated_data.update({
    'reservation_time': datetime.datetime.strptime(validated_data.get('reservation_time'), 'YYYY-MM-DD HH:mm').date()
  })
  return self.Meta.model(**validated_data)
解决方案
  1. 核心问题:strptime格式符使用错误
    Python的datetime.strptime不支持YYYY、MM这类占位符,正确的格式符是:
  • 四位年份:%Y
  • 两位月份:%m
  • 两位日期:%d
  • 24小时制小时:%H
  • 两位分钟:%M

修正后的代码:

import datetime

def create(self, validated_data):
    reservation_time_str = validated_data.get('reservation_time')
    validated_data['reservation_time'] = datetime.datetime.strptime(reservation_time_str, '%Y-%m-%d %H:%M').date()
    return self.Meta.model(**validated_data)
  1. DRF更规范的处理方式
    无需在create方法里手动转换,直接在Serializer字段中指定输入格式,让DRF自动处理:
from rest_framework import serializers

class ReservationSerializer(serializers.ModelSerializer):
    reservation_time = serializers.DateTimeField(input_formats=['%Y-%m-%d %H:%M'])

    class Meta:
        model = Reservation
        fields = ['reservation_time', ...]
  1. parse_date返回None的原因
    django.utils.dateparse.parse_date仅能解析纯日期字符串(如2024-05-26),你的输入带时间部分,所以返回None。如果要解析带时间的字符串,应使用django.utils.dateparse.parse_datetime,它支持YYYY-MM-DD HH:MM[:SS[.uuuuuu]]格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:42:42