棉花糖压扁嵌套物体

时间:2018-02-23 15:26:43

标签: python marshmallow

我的对象看起来有点像:

source = {
  id: 123,
  objects: [
    {
      random_data: aaaa,
      actual_data: {
        useful: 111,
        ...
      }
    }, 
    {
      random_data: bbbb,
      actual_data: {
        useful: 222,
        ...
      }
    }
  ]
}

虽然我可以很容易地将其序列化,但将其转换为以下格式会更有用:

dest = {
  id: 123,
  objects: [
    {
      useful: 111,
      ...
    },
    {
      useful: 222,
      ...
    }
  ]
}

鉴于我已经有了一个最内层对象的模式(上面的源代码中为actual_data - 它比我的示例显示要复杂得多),展平嵌套对象的最佳方法是什么,所以我只在没有额外深度的情况下从actual_data获取对象?我原以为它会像

objects = Nested(UsefulSchema, many=True, load_from"<something>.useful_data")

但是如果没有预处理数据,我就无法找到解决方案。

注意我已经简化了我的例子以提供最简单的问题形式,在我的实际代码中,源数据是来自sqlalchemy的类似对象的大型列表。

1 个答案:

答案 0 :(得分:1)

对于棉花糖版本> = 3(Python 3)

您可以通过使用Pluck字段来允许父级从子级获取数据来实现此目的。

class ActualDataSchema(ModelSchema):
    useful = fields.String()
    also_useful = fields.String()

class ObjectSchema(ModelSchema):
    useful = fields.Pluck(ActualDataSchema, 'useful')
    also_useful = fields.Pluck(ActualDataSchema, 'also_useful')

class DestSchema(ModelSchema):
    id = fields.Integer()
    objects = fields.Nested(ObjectSchema, many=True)

对于棉花糖版本<3(Python 2)

您必须改为使用MethodFunction字段。

class ObjectSchema(ModelSchema):
    useful = fields.Function(lambda obj: obj.actual_data.useful)
    also_useful = fields.Function(lambda obj: obj.actual_data.also_useful)

class DestSchema(ModelSchema):
    id = fields.Integer()
    objects = fields.Nested(ObjectSchema, many=True)

更多信息