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