如何在Marshmallow的@validates函数中访问pid字段值?
Marshmallow中验证函数访问其他字段值的正确方法
在Marshmallow里,@validates装饰的单个字段验证函数中,Schema实例本身并不存储传入的字段实际值,所以直接用self.pid或者self.fields相关方法无法获取到具体的输入数据,得用以下两种方式解决:
方法一:使用@validates_schema装饰器
这个装饰器用于验证整个数据结构,函数可以直接拿到所有字段的输入值,是跨字段验证的常用方式:
from marshmallow import Schema, fields, validates_schema, ValidationError class MySchema(Schema): pid = fields.Integer(required=True) visibility = fields.String(required=True) @validates_schema def validate_visibility_with_pid(self, data, **kwargs): pid = data["pid"] visibility = data["visibility"] # 示例验证逻辑:根据pid值判断visibility是否合法 if pid == 1 and visibility != "public": raise ValidationError("当pid为1时,visibility必须设为'public'")
方法二:在@validates函数中通过kwargs获取完整数据
如果坚持要针对单个字段用@validates,可以从函数的kwargs参数中取出data,里面包含所有已通过字段验证的输入值:
from marshmallow import Schema, fields, validates, ValidationError class MySchema(Schema): pid = fields.Integer(required=True) visibility = fields.String(required=True) @validates("visibility") def validate_visibility(self, value, **kwargs): pid = kwargs.get("data", {}).get("pid") # 注意:如果pid是必填字段,这里可以直接用data["pid"];如果是可选字段,要先判断是否存在 if pid == 1 and value != "public": raise ValidationError("当pid为1时,visibility必须设为'public'")
需要注意:kwargs["data"]里的字段值是已经通过各自字段验证规则的结果,所以如果pid字段验证失败,这里可能拿不到有效值,适合依赖其他必填字段的场景。
内容的提问来源于stack exchange,提问作者Renaud Michotte
相关产品推荐
相关产品推荐

