gpt4 book ai didi

marshmallow - 从 super 模式(棉花糖)继承 "exclude"元参数

转载 作者:行者123 更新时间:2023-12-04 02:46:58 25 4
gpt4 key购买 nike

我有一个对象层次结构和一个对应于它们的模式层次结构。此层次结构的中间级别的架构不包括特定的继承字段。我希望从它继承的模式会“继承”这个排除,但如果他们在他们的 Meta 类中添加自己的排除字段,情况似乎并非如此:

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

在上面的例子中, FinalSchema继承自 IntermediateSchema (排除字段 b )并排除字段 c在自己的 Meta类(class)。预期的行为是结果模式将排除 bc ,但实际上它只排除 c .

当然可以手动将superschema的排除字段包含在继承schema的排除字段中,但这不是继承的重点,而且很麻烦。

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

检查 marshmallow 的源代码表明,至少部分支持从 superschemas 的元类继承数据(即 ordered Meta 选项值是从 superschemas 继承的)。

最佳答案

您还需要为 Meta 类指定基类。您还需要使用某种反射从基类获取值并将其附加到它。

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)

关于marshmallow - 从 super 模式(棉花糖)继承 "exclude"元参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com