динамическое c преобразование сериализатора в flask остаток плюс на основе сериализованного значения в другом поле - PullRequest
0 голосов
/ 25 мая 2020

Есть ли какой-либо вариант для динамической c сериализации на основе определенного поля?

предположим такую ​​модель:

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

на основе значения obj в action_type Я хотел бы используйте соответствующий сериализатор внутри fields.Nested

есть ли какой-либо вариант без написания настраиваемого поля? и если я напишу настраиваемое поле, то могу ли я получить доступ к этому сериализованному объекту, а не только к сериализованному полю?

1 Ответ

1 голос
/ 30 мая 2020

с использованием полиморфизма должно помочь.

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

затем с использованием полей. Polymorph

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

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

и предоставление определений для сериализаторов с использованием api. наследовать вот так:

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