#python #sqlalchemy #marshmallow
#python #sqlalchemy #marshmallow
Вопрос:
Marshmallow обычно сериализует вложенные дочерние элементы (при условии, что вложенная схема определена). Например:
{
'id': 2,
'messages' : [
{
'id': 1,
'message': 'foo'
},
{
'id': 2,
'message': 'bar'
}
]
}
Однако marshmallow-sqlalchemy приводит к тому, что дочерние элементы просто представляются их первичным ключом. Например:
{
'id': 2,
'messages' : [
1,
2
]
}
Как я могу заставить marshmallow-sqlalchemy сериализовать дочерние объекты. Желательно, чтобы я мог указать глубину. Например: сериализуйте до 4 слоев в глубину, затем используйте поведение uid.
В идеале это должно настраиваться через schema.load()
, потому что оно должно быть динамическим в зависимости от того, где началась сериализация. Другими словами, привязывать это к самой схеме не имеет смысла. Однако, если это единственный способ сделать это, мне также любопытно услышать подобное решение.
Комментарии:
1. Можете ли вы предоставить код, который вы используете для своего второго примера? Вы просто используете
class Meta
?
Ответ №1:
Для этого можно использовать вложенное поле.
Предполагая, что у вас есть схема, которая выглядит следующим образом:
class MessageSchema(Schema):
msg_id = fields.Integer()
message = fields.String()
something = fields.String()
class ListSchema(Schema):
list_id = fields.Integer()
messages = fields.Nested(MessageSchema, only=['msg_id', 'message'])
Чтобы включить только определенные поля, используйте only
параметр при вызове Nested
(смотрите пример использования выше, где в сериализованный вывод включены только поля msg_id
и message
).
В документах Marshmallow есть более подробный и полный пример: