是否有基于特定字段的动态序列化选项?
假设这样的模型:
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
中使用适当的序列化器
没有写自定义字段的选项吗?如果我编写自定义字段,那么我可以访问整个序列化对象,而不仅仅是序列化字段吗?
使用多态性可以解决问题。
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'))
})