从超级模式继承"exclude"元参数(棉花糖)



我具有与它们相对应的对象的层次结构和模式的层次结构。该层次结构中间级别的模式不包括特定的继承字段。我希望从中继承的模式将"继承"此排除,但是如果他们在元类中添加自己的排除字段,这似乎并非如此:

from marshmallow import fields
from marshmallow.schema import Schema

class AncestorSchema(Schema):
    a = fields.Str()
    b = fields.Str()

class IntermediateSchema(AncestorSchema):
    c = fields.Str()
    class Meta:
        exclude = ('b',)

class FinalSchema(IntermediateSchema):
    d = fields.Str()
    class Meta:
        exclude = ('c',)

value = dict(
    a="Field A",
    b="Field B",
    c="Field C",
    d="Field D"
)
print(IntermediateSchema().dump(value).data)
>>> {'c': 'Field C', 'a': 'Field A'}
print(FinalSchema().dump(value).data)
>>> {'d': 'Field D', 'a': 'Field A', 'b': 'Field B'}

在上面的示例中,FinalSchemaIntermediateSchema继承(不包括字段b),并在其自己的Meta类中排除字段c。预期的行为是由此产生的模式将不排除bc,但实际上仅排除c

当然,可以手动包括Superschema的排除字段,即继承模式的排除字段,但这不是继承的目的,此外,它很麻烦。

我想知道是否可以以优雅的方式实现所需的行为,或者当前的模式继承的行为实际上是一个错误。

检查棉花糖的源代码表明,从Superschemas的元类中的数据继承至少得到部分支持(即ordered Meta选项值是从SuperSchemas继承的)。

另一个答案不起作用,因为self未定义。我找到了一个有效的解决方案。

from marshmallow import fields
from marshmallow.schema import Schema

class AncestorSchema(Schema):
    a = fields.Str()
    b = fields.Str()

class IntermediateSchema(AncestorSchema):
    c = fields.Str()
    class Meta:
        exclude = ('b',)

class FinalSchema(IntermediateSchema):
    d = fields.Str()
    def __init__(self, *args, **kwargs):
        self.opts.exclude += ('c',)
        super().__init__(*args, **kwargs)

您还需要为元类指定基类。您还需要使用某种反思来从基类获取价值并附加到它。

from marshmallow import fields
from marshmallow.schema import Schema

class AncestorSchema(Schema):
    a = fields.Str()
    b = fields.Str()

class IntermediateSchema(AncestorSchema):
    c = fields.Str()
    class Meta:
        exclude = ('b',)

class FinalSchema(IntermediateSchema):
    d = fields.Str()
    def __init__(self, *args, **kwargs):
        self.opts.exclude += ('c',)
        super().__init__(*args, **kwargs)

相关内容

  • 没有找到相关文章

最新更新