我正在开发一个处理嵌套数据结构的API。当尝试使用棉花糖时,我无法提出创建嵌套模型实例的解决方案,并引用其父实例。 Marshmallow的post_load按照该顺序从孩子到父母,而不是父母对孩子。有没有办法扭转这种局面?我想首先序列化父项并将其作为上下文传递给子项。
var_test = {
"id": 1,
"name": "dad a",
"children_a": [
{
"id": 2,
"name": "child 1 - 2",
"grand_children_a": [
{
"id": 2,
"name": "child 1 - 2",
}
]
},
{
"id": 3,
"name": "child 2 - 2",
}
]
}
class ParentA(Schema):
id = fields.Integer()
name = fields.String()
children_a = fields.Nested('ChildrenA', many=True)
@post_load()
def pl_handler(self, data):
# create Parent A
return data
class ChildrenA(Schema):
id = fields.Integer()
name = fields.String()
grand_children_a = fields.Nested('GrandchildrenA', many=True)
@post_load()
def pl_handler(self, data):
# create child of Parent A
return data
class GrandchildrenA(Schema):
id = fields.Integer()
name = fields.String()
@post_load()
def pl_handler(self, data):
# create child of ChildrenA
return "grand child string"
var_s = ParentA()
var_s.load(var_test)
答案 0 :(得分:0)
我认为,您不需要post_load,因为没有要从该模式反序列化的类,因此只需删除它,它就可以工作。 如果您打算对它进行反序列化并将其保留在任何类中,则需要返回post_load装饰器,例如:
from marshmallow import Schema, fields, INCLUDE, post_load
class Author:
def __init__(self, name, age):
self.name = name
self.age = age
class Book:
def __init__(self, title, description, author):
self.title = title
self.description = description
self.author = author
class AuthorSchema(Schema):
name = fields.Str()
age = fields.Int()
@post_load
def load_author(self, data, **kwargs):
return Author(**data)
class BookSchema(Schema):
title = fields.Str()
description = fields.Str()
author = fields.Nested(AuthorSchema)
@post_load
def load_book(self, data, **kwargs):
return Book(**data)
data = {
"title": "Test Book",
"description": "A book Test",
"author": {"name": "Vivek", "age": 35},
}
book = BookSchema(unknown=INCLUDE).load(data )
print(book)
print(book.author)
print(book.author.name)