python - Marshmallow Parent Schema - 如何在子模式之间共享验证装饰器?
问题描述
我有一个父棉花糖模式“ParentSchema”和 2 个嵌套子模式“ChildSchema1”和“ChildSchema2”。两个嵌套的子模式都利用@validates_schema装饰器从棉花糖中进行字段验证。它们看起来像这样:
ParenSchema.py
from marshmallow import Schema, fields
from schemas.childSchema1 import ChildSchema1
from schemas.childSchema2 import ChildSchema2
class ParentSchema(Schema):
child1 = fields.Nested(ChildSchema1)
child2 = fields.Nested(ChildSchema2)
foo = fields.String()
bar = fields.String()
ChildSchema1.py
from marshmallow import Schema, pprint, post_load
from marshmallow import fields, ValidationError, validates, validates_schema
class ChildSchema1(Schema):
field1 = fields.String()
field2 = fields.String()
common_field = fields.String()
@validates("common_field")
def validate_common_field(self, common_field):
try:
# Validation logic
except:
raise ValidationError('common_field is not valid')
ChildSchema2.py
from marshmallow import Schema, pprint, post_load
from marshmallow import fields, ValidationError, validates, validates_schema
class ChildSchema2(Schema):
common_field = fields.String()
field3 = fields.String()
@validates("common_field")
def validate_common_field(self, common_field):
try:
# Exact Same Validation logic as common_field from ChildSchema1
except:
raise ValidationError('common_field is not valid')
鉴于 ChildSchema1 和 ChildSchema2 都具有相同名称的字段,具有相同的验证器函数,我很想遵循DRY 原则并将该函数提取到 ParentSchema.py。
解决方案
我发现的一个解决方案是创建一个单独的类来托管共享验证功能:
def validate_common_field(self, common_field):
try:
# Exact Same Validation logic as common_field from ChildSchema1
except:
raise ValidationError('common_field is not valid')
并通过删除 @validates 装饰器并validate
像这样使用 schema 字段中的参数来使用 ChildSchema1 和 ChildSchema2 中的内容。
ChildSchema1.py
from marshmallow import Schema, pprint, post_load
from marshmallow import fields, ValidationError, validates, validates_schema
from validators import *
class ChildSchema1(Schema):
field1 = fields.String()
field2 = fields.String()
common_field = fields.String(validate=validate_common_field)
validators.py from marshmallow import ValidationError, 验证
def validate_common_field(self, common_field):
try:
# Validation logic
except:
raise ValidationError('common_field is not valid')
推荐阅读
- javascript - 我们如何使用异步函数来获取 api 数据?
- jmeter - 为什么 JMeter HTTP 响应与浏览器响应不同?
- dc.js - 将自定义减少值分配给变量
- windows - 如何访问现有的 AppBarButton 并禁用它
- c++ - 来自数组的 QList 请求项未提供正确的参考
- r - tabmeans.survey 多类别变量的问题。未识别设计中的变量
- javascript - 用户输入发送到数据库
- node.js - 在 npm 中启动 lite-server 时出错
- powershell - 仅使用 powershell 为单个用户提供 NTFS 权限
- ansible - Ansible - 如何通过环境变量在库存文件中添加客户端列表