首页 > 解决方案 > 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。

标签: pythonpython-3.xmarshmallow

解决方案


我发现的一个解决方案是创建一个单独的类来托管共享验证功能:

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')

推荐阅读