在烧瓶架中进行动态序列化解析,并基于另一个字段中的序列化值

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

是否有基于特定字段的动态序列化选项?

假设这样的模型:

class Action(base):
    id = Column(Integer, primary_key=True)
    action_type = Column(Enum(SubscriptionActionType, inherit_schema=True), nullable=False)
    parameters = Column(JSONB)

基于action_type中的obj值,我想在fields.Nested中使用适当的序列化器

没有写自定义字段的选项吗?如果我编写自定义字段,那么我可以访问整个序列化对象,而不仅仅是序列化字段吗?

flask marshalling flask-restplus
1个回答
0
投票

使用多态性可以解决问题。

class Action(base):
    id = Column(Integer, primary_key=True)
    action_type = Column(Enum(SubscriptionActionType, inherit_schema=True), nullable=False)
    parameters = Column(JSONB)

    __mapper_args__ = {
        'polymorphic_on' : action_type
    }


class ActionOne(Action):

    __mapper_args__ = {
        'polymorphic_identity': 'action_one'
    }


class ActionTwo(Action):

    __mapper_args__ = {
        'polymorphic_identity': 'action_two'
    }

然后使用fields.Polymorph

mapping = {
    ActionOne: action_one_serializer,
    ActionTwo: action_two_serializer,
}

fields = api.model('Action', {
    owner: fields.Polymorph(mapping)
})

并使用api.inherit为串行器提供定义,如下所示:

base_action_serializer = api.model('BaseAction', {
    'id': fields.Integer(readonly=True),
    'action_type': fields.String(discriminator=True)
})

action_one_serializer = api.inherit('ActionOne', parent, {
    'extra_one': fields.String(attribute('parameters.extraOne'))
})

action_two_serializer = api.inherit('ActionTwo', parent, {
    'extra_two': fields.String(attribute('parameters.extraTwo'))
})
© www.soinside.com 2019 - 2024. All rights reserved.