首页 > 解决方案 > Marshmallow - 如何在验证中使用加载的数据

问题描述

我正在使用棉花糖创建一个用于数据验证的 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.')

在这个例子中,我想访问通过加载函数传递的数据字典。如何访问模式验证方法中的数据对象?

谢谢你的帮助!

标签: pythonpython-3.xmarshmallow

解决方案


要回答您的问题,您可以使用带有 @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(由棉花糖维护者维护)轻松解析带有棉花糖的请求。


推荐阅读