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

为何Django REST Framework序列化器is_valid()返回False?

问题分析:序列化器is_valid()返回False的原因及解决办法

首先来看你的序列化器定义:

class SprintSerializer(serializers.ModelSerializer): 
    links = serializers.SerializerMethodField() 
    class Meta: 
        model = Sprint 
        fields = ('id', 'name', 'description', 'end', 'links', )

你在Shell中初始化序列化器的代码:

serializer = SprintSerializer(data=({'name':'JHolmes','description':'ambassador','end':'2019-01-27T15:17:10.375877'}))

执行后得到的结果:

serializer.data 
{'name': 'JHolmes', 'description': 'ambassador', 'end': '2019-01-27T15:17:10.375877'} 
serializer.validated_data {} 
serializer.is_valid() False

原因解析

从serializer.errors的输出可以直接定位问题:

serializer.errors 
{'end': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')]}

核心问题出在end字段的格式上:你的模型中end字段应该是DateField类型(而非DateTimeField),Django REST Framework对DateField的默认验证规则只接受纯日期格式YYYY[-MM[-DD]],不包含时间部分。而你传入的'2019-01-27T15:17:10.375877'是带时间戳的DateTime格式,不符合验证要求,因此序列化器验证失败。

解决办法

有两种可选的修复方式:

  • 如果业务只需要存储日期信息:将end字段的值修改为纯日期格式,比如'2019-01-27',此时再执行serializer.is_valid()就会返回True,验证通过。
  • 如果业务需要存储完整的时间信息:修改模型中的end字段为DateTimeField,序列化器会自动适配DateTime格式的验证规则,此时传入带时间的格式就不会触发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:05:17