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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:20:09