嵌套的Python棉花糖参数

时间:2019-10-25 06:06:34

标签: python marshmallow

我使用图书馆已有很短的时间了。我一直在搜索,但无法解决问题。

我有两个模式:

class SonSchema(Schema):
    paramter1 = fields.Str
    parameter2 = fields.Str

class FatherSchema(Schema):
    son = fields.Nested(SonSchema)

然后我有加载功能:

flag = True
schema = FatherSchema().load(response)

我需要的取决于参数SonSchema中的Flag验证某些参数,例如,如果flag = True,则参数1需要在响应中(带有@validation_schema)。

我真的不知道如何在架构实例中传递参数来获取SonSchema。你有什么想法吗?

2 个答案:

答案 0 :(得分:0)

根据flag,使用不同的架构可能会更好。您可以使用继承来减少重复。

class SonSchema(Schema):
    paramter1 = fields.Str
    parameter2 = fields.Str

class FatherSchema(Schema):
    son = fields.Nested(SonSchema)

class ValidatedSonSchema(SonSchema):
    @validates_schema
    def validation_method(self, data, kwargs):
        ...

class ValidatedFatherSchema(FatherSchema):
    son = fields.Nested(ValidatedSonSchema)

flag = True
schema = ValidateFatherSchema if flag else FatherSchema
result = schema().load(response)

答案 1 :(得分:0)

Jérôme的答案是正确的,但是如果您只想使用一种模式来验证某种情况,则始终可以设置模式上下文,然后在内部验证方法中根据上下文内的标志检查所需内容:

class SonSchema(Schema):
  parameter1 = fields.Str()
  parameter2 = fields.Str()

  @validates_schema
  def validate_parameters(self, data, **kwargs):
    is_flag = self.context.get('flag', False)
    print(self.context)
    # Parameters validation based on flag

您可以为FatherSchema设置上下文,并且可以在子嵌套模式中使用它:

schema = FatherSchema(context={'flag': True})
data = {'son': {'parameter1': 'parameter1 value', 'parameter2': 'parameter2 value'}}
schema.load(data)

请访问Extending SchemasSchema文档页面以获取更多信息。