我正在尝试使用Marshmallow序列化一个对象,使“相关”属性组合成一个原始对象上不存在的单个字典。我的代码:
from marshmallow import Schema, fields, pprint
import json
class StatsSchema(Schema):
population = fields.Int()
rating = fields.Int()
class AnimalSchema(Schema):
name = fields.Str()
features = fields.List(fields.Str())
stats = fields.Nested(StatsSchema)
dog = {
'name':'dog',
'features': ['tongue', 'wet nose'],
'population': 200,
'rating': 10
}
animal_schema = AnimalSchema()
data, errors = animal_schema.dump(dog)
print(json.dumps(data, indent=2))
实际结果:
{
"features": [
"tongue",
"wet nose"
],
"name": "dog"
}
期望的结果:
{
"features": [
"tongue",
"wet nose"
],
"name": "dog",
"stats": {"population": 500, "rating": 10}
}
我理解输出中缺少“stats”键,因为它不在原始对象上,但我不知道如何指定Marshmallow应该使用该对象创建新的“stats”键作为新词典
答案 0 :(得分:0)
我找到了一种创建内部字典的可能方法。不确定它是否是唯一/最好的方法:
class AnimalSchema(Schema):
name = fields.Str()
features = fields.List(fields.Str())
stats = fields.Method('get_stats')
def get_stats(self, post):
data, err = StatsSchema().dump(post)
return data
答案 1 :(得分:0)
这在https://github.com/marshmallow-code/marshmallow/issues/940中进行了讨论。
你可以做到
class AnimalSchema(Schema):
name = fields.Str()
features = fields.List(fields.Str())
stats = fields.Nested(StatsSchema, dump_only=True)
class Animal:
[...]
@property
def stats(self):
return {'population': self.population, 'rating': self.rating}