сериализация дочерних элементов в marshmallow-sqlalchemy

#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 есть более подробный и полный пример: