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

