Python Marshmallow 将同一模式的每个模式变体的不同字段设置为“必填”

问题描述 投票:0回答:1

我有以下架构:

class MySchema(Schema):
    id = fields.Str()
    name = fields.Str()
    value = fields.Str()
    description = fields.Str()

我想使用 Flask 验证不同类型请求的一些输入数据。

对于 GET 请求,我希望 id 字段为必填字段 (

id = fields.Str(required=True)
)。

对于 POST 请求,我不需要 id 存在,但名称、值和描述字段需要有

required=True
。我知道如何在验证输入数据时排除 id:
schema = MySchema(exclude=["id"])

对于 PUT 请求,我需要 id 以及名称、值或描述中的至少一项。

我可以只有 3 种不同的模式,但我会尽可能避免这种情况。

我正在思考类似

schema = MySchema(require=["id"])
的事情,我可以在加载架构时动态设置所需的字段。

python schema flask-restful marshmallow
1个回答
0
投票

我找到了一个很好的解决方案,使用模式的

context
属性和
@validates_schema
装饰器。

schema = MySchema()
schema.context["method"] = "POST"

...

schema = MySchema()
schema.context["method"] = "PUT"

在我的架构中:

from marshmallow import Schema, validates_schema, ValidationError, fields

class MySchema(Schema):
    id = fields.Str()
    name = fields.Str()
    value = fields.Str()
    description = fields.Str()

    @validates_schema
    def validate_schema(self, data, **kwargs):
        if "method" in self.context:
            required_fields = []
            missing_fields = []
            if self.context["method"] == "POST":
                required_fields = ["name", "action", "enabled"]
            
            if self.context["method"] == "PUT":
                required_fields = ["id"]
                
            for field in required_fields:
                if field not in data:
                    missing_fields.append(field)
            
            if len(missing_fields) >= 1:
                raise ValidationError(["Missing data for required field."], field_name=missing_fields[0])
© www.soinside.com 2019 - 2024. All rights reserved.