如何在棉花糖中人为地嵌套模式?

时间:2018-08-21 15:06:58

标签: python serialization marshmallow

在棉花糖中,是否有一种方法可以将当前对象传递到Nested字段以产生人为嵌套的序列化?例如,考虑我正在序列化的对象:

example = Example(
    name="Foo",
    address="301 Elm Street",
    city="Kalamazoo",
    state="MI",
)

我想为此生成JSON:

{
    "name": "Foo",
    "address": {
            "street": "301 Elm Street",
            "city": "Kalamazoo",
            "state": "MI"
    }
}

本质上,这将是AddressSchema内的嵌套ExampleSchema,如下所示:

class AddressSchema:
    street = fields.String(attribute="address")
    city = fields.String()
    state = fields.String()

class ExampleSchema:
    name = fields.String()
    address = fields.Nested(AddressSchema)

...但是那并不能完全满足我的要求。我可以使用自定义函数,但如果可能的话,我想使用内置方法。

1 个答案:

答案 0 :(得分:1)

我设法找到一种解决方案,使我能够保留内省并只使用内置字段;不过有点奇怪。我对ExampleSchema进行了修改,使其包含一个@pre_load钩子,该钩子添加了一个自指属性,并指向该字段:

class ExampleSchema:
    name = fields.String()
    address = fields.Nested(
        AddressSchema, attribute="_marshmallow_self_reference"
    )

    @pre_dump
    def add_self_reference(self, data):
        setattr(data, "_marshmallow_self_reference", data)