我希望Marshmallow Schema
具有以下输出json -
{
"_id": "aae216334c3611e78a3e06148752fd79",
"_time": 20.79606056213379,
"more_data" : {...}
}
Marshmallow没有序列化私人成员,所以这就像我可以得到的那样 -
class ApiSchema(Schema):
class Meta:
strict = True
time = fields.Number()
id = fields.String()
但我确实需要输出json中的下划线。
有没有办法告诉Marshmallow使用不同的名称序列化字段?
答案 0 :(得分:6)
class ApiSchema(Schema):
class Meta:
strict = True
_time = fields.Number(attribute="time")
_id = fields.String(attribute="id")
答案 1 :(得分:3)
Marshmallows api reference中详细记录了答案。
我需要使用dump_to
:
class ApiSchema(Schema):
class Meta:
strict = True
time = fields.Number(dump_to='_time')
id = fields.String(dump_to='_id')
答案 2 :(得分:2)
接受的答案(使用attribute
)对我不起作用,可能是because:
注意:这仅应用于非常特殊的用例,例如为单个属性输出多个字段。在大多数情况下,您应该改用data_key。
但是data_key
表现不错:
class ApiSchema(Schema):
class Meta:
strict = True
_time = fields.Number(data_key="time")
_id = fields.String(data_key="id")
答案 3 :(得分:1)
在返回序列化对象之前,您可以将dump
方法覆盖到 prepend 下划线到选定的字段:
class ApiSchema(Schema):
class Meta:
strict = True
time = fields.Number()
id = fields.String()
def dump(self, *args, **kwargs):
special = kwargs.pop('special', None)
_partial = super(ApiSchema, self).dump(*args, **kwargs)
if special is not None and all(f in _partial for f in special):
for field in special:
_partial['_{}'.format(field)] = _partial.pop(field)
return _partial
api_schema = ApiSchema(...)
result = api_schema.dump(obj, special=('id', 'time'))
您也可以在单独的自定义方法上使用post_dump
装饰器,而不必覆盖dump
,但是,您可能必须将要修改的字段硬编码为类的一部分,根据您的使用情况,这可能不灵活。