Marshmallow验证POST负载时出现未知字段错误的求助
问题分析与解决思路
核心问题
- 类字段缩进错误:你的Marshmallow Schema类中,字段定义未缩进,导致字段不属于Schema类,Schema无法识别
orderedItems和userData,进而将请求中的对应字段判定为未知字段。 - 字段名称不匹配:前端请求的用户字段是
user,但后端OrderSchema中定义的是userData,名称不匹配触发错误。
修复步骤
1. 修正类字段缩进
Python中类属性必须缩进,确保Schema字段属于类的一部分:
from marshmallow import validate, validates, validates_schema, \ ValidationError, post_dump, validates from api import ma class MealsOrderSchema(ma.Schema): id = ma.Integer(required=True) amount = ma.Integer(required=True) price = ma.Float() name = ma.String() class UserDataSchema(ma.Schema): name = ma.String(required=True) email = ma.String(required=True, validate=[validate.Email()]) city = ma.String() class OrderSchema(ma.Schema): orderedItems = ma.Nested(MealsOrderSchema(many=True)) user = ma.Nested(UserDataSchema) # 匹配前端的`user`字段名
2. 字段名称映射(可选方案)
如果不想修改后端字段名,可使用data_key参数映射前端字段:
class OrderSchema(ma.Schema): orderedItems = ma.Nested(MealsOrderSchema(many=True)) userData = ma.Nested(UserDataSchema, data_key="user") # 将前端`user`映射到后端`userData`
3. 忽略未知字段(可选)
若需允许请求存在Schema未定义的字段,可配置Meta类:
class OrderSchema(ma.Schema): class Meta: unknown = ma.EXCLUDE # 忽略未定义字段,仅验证已声明字段 orderedItems = ma.Nested(MealsOrderSchema(many=True)) user = ma.Nested(UserDataSchema)
验证效果
修正后,Schema会正确识别orderedItems和user字段,嵌套Schema也能正常验证子字段规则,即可通过请求验证。
内容的提问来源于stack exchange,提问作者dannisis
相关产品推荐
相关产品推荐

