python - Marshmallow Parent Schema - 如何在子模式之间共享验证装饰器?

标签 python python-3.x marshmallow

我有一个父棉花糖架构“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 Principle并将该函数拉出到 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 参数来使用 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)

验证器.py from marshmallow import ValidationError,验证

def validate_common_field(self, common_field):
        try:
            # Validation logic
        except:
            raise ValidationError('common_field is not valid')

关于python - Marshmallow Parent Schema - 如何在子模式之间共享验证装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54564331/

相关文章:

python - 使用 Python 类作为数据容器

python - c++&python关闭和打开不同dll中的文件

python - 按空格键时图像显示 300 毫秒

python - 反序列化棉花糖中的嵌套字段

python - 如何在单个 y-tick 上绘制散点图

python-3.x - 使用 Azure Function (Python) 调用 HTTP 触发器逻辑应用程序(调用后)

python-3.x - pandas read_csv 内存消耗

Python UDP 和 Websocket 结合在一起

python 棉花糖 : deserializing nested schema with only one exposed key

python - 如何使用 Marshmallow 序列化 MongoDB ObjectId?