如何以不同的名称序列化 Marshmallow 字段
How to serialize a Marshmallow field under a different name
我想要棉花糖 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 使用不同的名称序列化字段?
您可以重写 dump
方法以 在返回序列化对象之前将下划线添加到所选字段:
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
,但是,您可能必须将要修改的字段硬编码为class,这可能不灵活,具体取决于您的用例。
棉花糖 api reference 中详细记录了答案。
我需要使用 dump_to
:
class ApiSchema(Schema):
class Meta:
strict = True
time = fields.Number(dump_to='_time')
id = fields.String(dump_to='_id')
https://marshmallow.readthedocs.io/en/2.x-line/quickstart.html#specifying-attribute-names
尽管文档是针对版本 2 的,但从 3.5.1 开始似乎仍然有效。稳定版本 3 文档不会有这个例子。
class ApiSchema(Schema):
class Meta:
strict = True
_time = fields.Number(attribute="time")
_id = fields.String(attribute="id")
接受的答案(使用 attribute
)对我不起作用,可能 because:
Note: This should only be used for very specific use cases such as outputting multiple fields for a single attribute. In most cases, you should use data_key instead.
但是 data_key
效果很好:
class ApiSchema(Schema):
class Meta:
strict = True
_time = fields.Number(data_key="time")
_id = fields.String(data_key="id")
我想要棉花糖 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 使用不同的名称序列化字段?
您可以重写 dump
方法以 在返回序列化对象之前将下划线添加到所选字段:
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
,但是,您可能必须将要修改的字段硬编码为class,这可能不灵活,具体取决于您的用例。
棉花糖 api reference 中详细记录了答案。
我需要使用 dump_to
:
class ApiSchema(Schema):
class Meta:
strict = True
time = fields.Number(dump_to='_time')
id = fields.String(dump_to='_id')
https://marshmallow.readthedocs.io/en/2.x-line/quickstart.html#specifying-attribute-names
尽管文档是针对版本 2 的,但从 3.5.1 开始似乎仍然有效。稳定版本 3 文档不会有这个例子。
class ApiSchema(Schema):
class Meta:
strict = True
_time = fields.Number(attribute="time")
_id = fields.String(attribute="id")
接受的答案(使用 attribute
)对我不起作用,可能 because:
Note: This should only be used for very specific use cases such as outputting multiple fields for a single attribute. In most cases, you should use data_key instead.
但是 data_key
效果很好:
class ApiSchema(Schema):
class Meta:
strict = True
_time = fields.Number(data_key="time")
_id = fields.String(data_key="id")