【发布时间】:2020-05-21 01:47:04
【问题描述】:
我正在尝试在扩展 marshmallow.Schema 的类中实现一些逻辑,以便我可以覆盖使用 pre_dump 修饰的方法中某个字段的 load_only 属性的默认值。
默认情况下,load_only=True 但我希望能够在某些情况下将其设置为 False,并认为实现此目的的最佳方法是设置一个可以在预转储方法中检查的上下文值,然后设置 load_only=False 以在序列化期间包含该字段。
为了证明这一点,我有一个 ParentSchema 类和一个 ChildSchema 类。 ParentSchema 有一个名为 children 的字段,其中包含 ChildSchema 对象的列表。
from marshmallow import Schema, fields, post_load, pre_dump
import json
class Child(object):
def __init__(self, id=None, data=None, parent_id=None):
self.id = id
self.data = data
self.parent_id = parent_id
def __repr__(self):
return 'id=' + str(self.id) + ', data=' + str(self.data) + ', parent_id=' + str(self.parent_id)
class ChildSchema(Schema):
id = fields.Integer(dump_only=True)
data = fields.String(required=True)
parent_id = fields.Integer(required=False)
@post_load
def make_child(self, data, **kwargs):
return Child(**data)
class Parent(object):
def __init__(self, id=None, data=None, children=None):
self.id = id
self.data = data
self.children = children
def __repr__(self):
return 'id=' + str(self.id) + ', data=' + str(self.data) + ', children=' + str(self.children)
class ParentSchema(Schema):
id = fields.Integer(dump_only=True)
data = fields.String(required=True)
children = fields.Nested(ChildSchema, many=True, load_only=True)
@post_load
def make_parent(self, data, **kwargs):
return Parent(**data)
@pre_dump
def check_context(self, data, **kwargs):
if 'dump_children' in self.context:
self.fields['children'].load_only = False
return data
默认行为应该是不序列化子字段,但是如果在创建 ParentSchema 对象时在上下文字典中提供了键“dump_children”,则 load_only 设置为 False,我希望这会导致子字段为序列化。
parent_data = [
{
"data": "parent 1",
"children": [
{
"data": "child 1"
},
{
"data": "child 2"
}
]
},
{
"data": "parent 2",
"children": [
{
"data": "child 3"
}
]
}
]
parents = ParentSchema(context={'dump_children': True}, many=True).dump(parent_data)
print(json.dumps(parents, indent=2))
我不明白为什么,尽管 load_only 按预期设置为 False,但会产生:
[
{
"data": "parent 1"
},
{
"data": "parent 2"
}
]
代替:
[
{
"data": "parent 1",
"children": [
{
"data": "child 1"
},
{
"data": "child 2"
}
]
},
{
"data": "parent 2",
"children": [
{
"data": "child 3"
}
]
}
]
是否有其他逻辑阻止该字段被序列化?还是有更好的方法来实现我的目标?
【问题讨论】:
标签: python marshmallow