dynamic serializer resolving in flask rest plus based on serialized value in another field dynamic serializer resolving in flask rest plus based on serialized value in another field flask flask

dynamic serializer resolving in flask rest plus based on serialized value in another field


using polymorphism should do the trick.

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

then using fields.Polymorph

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

and providing definitions for serializers using api.inherit like this:

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