python - 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.')
在这个例子中,我想访问通过加载函数传递的数据字典。如何访问模式验证方法中的数据对象?
谢谢你的帮助!
解决方案
要回答您的问题,您可以使用带有 @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(由棉花糖维护者维护)轻松解析带有棉花糖的请求。
推荐阅读
- laravel - 一次性替换 Laravel 5.7 中的翻译结果?
- apache-spark - 到 rdd 的结构化流式传输不起作用
- laravel - Laravel 邮递员问题
- c# - 如何在 ASP.NET Core 应用程序中使用位图资源?
- python - 如何过滤熊猫数据框中的行,其中列的值等于列表的某个值
- android - 为什么这段代码中没有对 ImageView 的引用?
- db2 - 如何确定在某个表上持有锁的应用程序和应用程序ID
- vb.net - google Adwords 中的 where () 语句出错
- sql - 带有 ORA-00936 的 SQL 查询实例:缺少表达式错误
- sql-server - 多维数据集未从 DTSX 运行更新