gpt4 book ai didi

marshmallow - 如何将 Schema.from_dict() 用于嵌套字典?

转载 作者:行者123 更新时间:2023-12-04 02:43:32 25 4
gpt4 key购买 nike

我正在尝试使用以某些列表作为元素的嵌套字典来创建架构类。但是,当我执行 dumps() 时,只会转储顶级元素。

有一个 rest api 可以返回某些事物的列表,例如。用户列表。但是架构使得某些聚合详细信息在顶层发送,数据看起来像这样。这就是我期望的输出:

   {
"field1": 5,
"field2": false,
"field3": {
"field4": 40,
"field5": [
{
"field6": "goo goo gah gah",
"field7": 99.341879,
"field8": {
"field9": "goo goo gah gah",
"field10": "goo goo gah gah"
}
}]
}
}

这是我的代码:

MySchema = Schema.from_dict(
{
"field1": fields.Int(),
"field2": fields.Bool(),
"field3": {
"field4": fields.Int(),
"field5": [
{
"field6": fields.Str(),
"field7": fields.Float(),
"field8": {
"field9": fields.Str(),
"field10": fields.Str()
}
}]
}
}
)

#Then use it like:

response = MySchema().dumps(data)

实际结果:

"{\"field1\": 5, \"field2\": false}"

最佳答案

选项 1

您正在寻找多个嵌套模式,它们通过 fields.Nested 互连:

from marshmallow import Schema, fields


Field8Schema = Schema.from_dict({
"field9": fields.Str(),
"field10": fields.Str()
})

Field5Schema = Schema.from_dict({
"field6": fields.Str(),
"field7": fields.Float(),
"field8": fields.Nested(Field8Schema),
})

Field3Schema = Schema.from_dict({
"field4": fields.Int(),
"field5": fields.List(fields.Nested(Field5Schema))
})

MySchema = Schema.from_dict({
"field1": fields.Int(),
"field2": fields.Bool(),
"field3": fields.Nested(Field3Schema),
})

MySchema().dump(data)

# {'field2': False,
# 'field1': 5,
# 'field3': {'field4': 40,
# 'field5': [{'field6': 'goo goo gah gah',
# 'field8': {'field9': 'goo goo gah gah', 'field10': 'goo goo gah gah'},
# 'field7': 99.341879}]}}

选项 2

如果嵌套不会那么深,使用 decorators 可能会更简单,即嵌套和不嵌套数据为 suggested in the docs :

class UserSchema(Schema):
@pre_load(pass_many=True)
def remove_envelope(self, data, many, **kwargs):
namespace = 'results' if many else 'result'
return data[namespace]

@post_dump(pass_many=True)
def add_envelope(self, data, many, **kwargs):
namespace = 'results' if many else 'result'
return {namespace: data}

感觉很适合你的情况。

评论

我建议不要使用 from_dict,因为它对于如此复杂的数据来说可读性较差,而是改用基于类的模式。

有很多 good examples嵌套在文档中。

关于marshmallow - 如何将 Schema.from_dict() 用于嵌套字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58190523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com