Marshmallow - 如何在验证中使用加载的数据

Marshmallow - how to use loaded data in validation

我正在创建一个 API 使用棉花糖进行数据验证。

数据被提供给JSON中的模式:

data = request.get_json()
schema = ItemSchema()
evaluated = schema.load(data)

if evaluated.errors:
            return {'message': evaluated.errors}, 400

该模式具有用 @validates 装饰器装饰的字段验证方法:

@validates('name')
def validate_name(self, name):
    existing_item = ItemModel.name_exists(name) #returns an object of type Item if the name exists. Names are unique
    if existing_item and existing_item._id !=  data['_id']:
        raise ValidationError('Item already exists.')

如本例所示,我想访问通过加载函数传递的数据字典。 如何访问架构验证方法中的数据对象?

感谢您的帮助!

要回答您的问题,您可以将模式验证器与 @validates_schema 装饰器一起使用。它有一个 pass_original 参数。

@validates_schema(pass_original=True)
def validate_name(self, data, input_data):
    existing_item = ItemModel.name_exists(data['name'])
    if existing_item and existing_item._id !=  input_data['_id']:
        raise ValidationError('Item already exists.')

但坦率地说,我认为您的用例是错误的。

如果是物品创建(POST),只需检查名称是否已经存在即可。

如果是项目修改 (PUT),您可以从请求路径中知道 ID。你应该能够从你的对象访问它。

此外,如果我可以建议,您可以使用 webargs(由 marshmallow 维护者维护)轻松解析 marshmallow 请求。