У меня есть схема Marshmallow, в которой объекты используют ключ для ссылки на объект, определенный в словаре в другой части структуры. Я хочу, чтобы ключ автоматически разрешался при десериализации объекта. Как я могу добиться этого эффекта в Marshmallow в идиоматической манере?
Обходной путь на данный момент состоит в том, чтобы разрешить все ссылки вручную, но это кажется неуклюжим, поскольку декларативный характер Marshmallow должен сделать это за нас автоматически.
Обратите внимание, что Marshmallow-SQLAlchemy поддерживает этот вид (де-)сериализации, когда столбцы объявлены как отношения", которые делают это автоматически для нас, но я хочу сделать это с данными JSON.
Вот пример того, чего я хочу достичь, когда fields.Relationship
является чем-то, чего еще не существует:
class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.Relationship('self', path="AddressBook.contacts", many=True)
class AddressBookSchema(Schema):
contacts = nested.Dict(keys=fields.String(), values=fields.Nested(UserSchema))
# ... create ``user`` ...
serialized_data = AddressBookSchema().dump(user)
pprint(serialized_data)
# "contacts": {
# "Steve": {
# "name": "Steve",
# "email": "[email protected]",
# "friends": ["Mike"]
# },
# "Mike": {
# "name": "Mike",
# "email": "[email protected]",
# "friends": []
# }
deserialized_data = UserSchema().load(result)
pprint(deserialized_data)
# "contacts": {
# "Steve": {
# "name": "Steve",
# "email": "[email protected]",
# "friends": [ {"name": "Mike", "email": "[email protected]"]
# },
# "Mike": {
# "name": "Mike",
# "email": "[email protected]",
# "friends": []
# }
Я также зарегистрировал ошибку в репозитории Marshmallow Github.