为何Serializer中非必填字段会被序列化为None而非省略?
问题解析
allow_null=True的影响:这个参数不仅允许字段值为None,还会让序列化器在未接收到该字段输入时,主动将其设为None并包含在data输出结果里。data与validated_data的区别:validated_data是验证后直接提取的原始输入数据,你传的是空字典,所以这里返回空的OrderedDict,完全符合预期。data是序列化器经过格式化处理后的输出数据,因为开启了allow_null=True,序列化器会自动为未传入的该字段填充None值,因此会出现{'field_one': None}的结果。
官方文档中“键不存在则不会包含在输出中”的描述,针对的是从模型实例/对象序列化的场景——比如你序列化一个没有field_one属性的对象,此时如果required=False且未设置allow_null=True,输出结果里就不会包含这个字段。但你当前是**反序列化(传入空字典验证)**后生成输出,allow_null=True的规则会优先生效,导致字段被保留并设为None。
如果希望空字典输入后data返回空字典,只需移除allow_null=True参数即可,修改后的序列化器如下:
class DumbSerializer(serializers.Serializer): field_one = serializers.CharField(required=False)
内容的提问来源于stack exchange,提问作者A G
相关产品推荐
相关产品推荐

