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

如何在Marshmallow中校验字段但不将其反序列化?

解决Marshmallow基于模型Schema中必填额外字段的校验与隐藏问题

我完全懂你的困扰——在基于数据库模型构建Marshmallow Schema时,想要加一个必填的额外字段,既要让它通过校验逻辑,又不能让它出现在最终反序列化得到的对象里。之前试了excluded和dump_only都没达到预期,这俩参数的作用其实和你想要的刚好错位了:

  • excluded会直接跳过这个字段的所有处理,包括校验,所以必填规则根本不会生效;
  • dump_only只是控制**序列化(把对象转成输出格式)**时不显示该字段,但反序列化(把输入数据转成对象)后的结果里依然会保留它。

正确的解决方案:用load_only=True + required=True

load_only这个参数正是为这种场景设计的:它会让字段只在反序列化阶段参与校验和数据接收,不会出现在任何序列化或反序列化后的输出对象中。结合required=True就能实现“必填校验通过,但最终结果里看不到该字段”的需求。

下面给你一个具体的代码示例(假设你用的是SQLAlchemy模型):

from marshmallow_sqlalchemy import SQLAlchemyAutoSchema
from your_models import User  # 假设这是你的SQLAlchemy模型
import marshmallow.fields as fields

class UserSchema(SQLAlchemyAutoSchema):
    # 额外添加的必填字段,设置load_only和required
    password_confirm = fields.Str(required=True, load_only=True)
    
    class Meta:
        model = User
        load_instance = True  # 如果需要生成模型实例的话

# 测试使用
data = {
    "username": "riku_xan",
    "email": "riku@example.com",
    "password": "123456",
    "password_confirm": "123456"
}

schema = UserSchema()
# 校验数据(如果缺少password_confirm会抛出ValidationError)
result = schema.load(data)

# 查看反序列化后的对象,不会包含password_confirm字段
print(result)
# 输出类似:<User(username='riku_xan', email='riku@example.com', ...)>
# 或者如果没开load_instance,就是字典形式,同样没有password_confirm键

额外说明:自定义校验扩展

如果你还需要对这个额外字段做自定义校验(比如和密码字段匹配),可以结合@validates装饰器:

from marshmallow import validates, ValidationError

class UserSchema(SQLAlchemyAutoSchema):
    password_confirm = fields.Str(required=True, load_only=True)
    
    class Meta:
        model = User
        load_instance = True

    @validates('password_confirm')
    def validate_password_confirm(self, value, data):
        if value != data.get('password'):
            raise ValidationError('Password confirmation does not match password')

这样就能完美实现你的需求:额外字段必填校验生效,同时不会出现在最终的反序列化结果里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:38:32