【问题标题】:marshmallow flatten nested objects棉花糖展平嵌套对象
【发布时间】:2018-02-23 15:26:43
【问题描述】:

我的对象看起来有点像:

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")

但如果不对数据进行预处理,我就无法找到解决方案。

NB 我已经简化了我的示例,以给出我的问题的最简单形式。在我的实际代码中,源数据是来自 sqlalchemy 的大量类似对象的列表。

【问题讨论】:

    标签: python marshmallow


    【解决方案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)
    

    对于棉花糖版本

    您必须改用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)
    

    更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2021-02-12
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多