Marshmallow自定义Validator异常:传入值为None问题排查
Marshmallow自定义字段校验函数接收值为None的原因及解决方案
1. 自定义字段未正确实现_deserialize方法
Marshmallow的字段核心反序列化逻辑由_deserialize方法处理,如果你直接继承fields.Field但未重写该方法,默认实现会返回None,这就导致校验函数拿到的参数是None。而内置Str字段已经完成了完整的反序列化逻辑,能正确将传入值传递给校验函数。
解决方法:重写_deserialize方法,确保返回原始值或处理后的值:
from marshmallow import fields, Schema, ValidationError def customValidation(value): if not value: raise ValidationError("Value cannot be empty") class CustomField(fields.Field): def _deserialize(self, value, attr, data, **kwargs): # 可在此添加自定义反序列化逻辑(如类型转换),最后返回有效数值 if value is None: raise ValidationError("Field cannot be None") return str(value) class MySchema(Schema): custom_field = CustomField(validate=customValidation, required=True)
2. 错误覆盖validate方法导致值传递异常
如果在自定义字段中重写了validate方法,但未正确传递value参数或未调用父类校验逻辑,会导致自定义校验函数无法接收到正确的传入值。
解决方法:若需字段级自定义校验,要么通过字段的validate参数传入校验函数,要么在重写validate时正确处理值并调用父类方法:
class CustomField(fields.Str): def validate(self, value): super().validate(value) # 先执行内置Str字段的校验逻辑 customValidation(value) # 再执行自定义校验
3. missing参数或必填配置问题
若自定义字段设置了missing=None,且未开启required=True,当传入数据中该字段缺失时会返回None。如果你确认已传入有效值,需检查字段是否设置required=True,避免因缺失值触发missing逻辑。
内容的提问来源于stack exchange,提问作者Candra wijayanto
相关产品推荐
相关产品推荐

