Группировка свойств объекта в новый словарь в схеме Marshmallow - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь сериализовать объект с помощью 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" как новый словарь, используя объект.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Это обсуждается в 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}
0 голосов
/ 23 мая 2018

Я нашел один из возможных способов создания внутреннего словаря.Не уверен, что это единственный / лучший метод:

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
...