将对象属性分组到Marshmallow模式中的新字典中

时间:2018-05-23 09:49:04

标签: python marshmallow

我正在尝试使用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”键作为新词典

2 个答案:

答案 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}