Flask-SQLAlchemy-Marshmallow Вложение

Я пытаюсь сериализовать данные из моделей отношений «один ко многим» с помощью Marshmallow во Flask. Я прочитал документы Marshmallow и SQLAlchemy, но не смог заставить их работать. Может ли кто-нибудь мне помочь.

Модели:

class Category(db.Model):
    __tablename__ = 'category_mn'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(45))
    status = db.Column(db.Integer, server_default=db.FetchedValue())
    items = db.relationship('Items', backref='category', lazy='dynamic')
    timestamp = db.Column(db.DateTime, server_default=db.FetchedValue())


class Items(db.Model):
    __tablename__ = 'items_mn'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100))
    category_id = db.Column(db.Integer, db.ForeignKey('category_mn.id'))
    timestamp = db.Column(db.DateTime, server_default=db.FetchedValue())

Схемы:

class CatSchema(ma.ModelSchema):
    class Meta:
        model = Category
        fields = ('id', 'name', 'status')


class ItemSchema(ma.ModelSchema):

    class Meta:
        model = Items
        fields = ('id', 'name')
    category = ma.Nested(CatSchema, many=True)

Я ищу такой вывод:

[{'id':1, 'name':'Test', 'category':{'id':1, 'name':'Test Cat'}}]

person Kaartz    schedule 13.06.2017    source источник


Ответы (1)


Вы ссылаетесь на модели, которых нет в ваших схемах.

Кроме того, category в Items не повторяется (это сторона «один» в отношении «один ко многим»), поэтому параметр many=True вызывает ошибку.

И category должен появиться в атрибуте fields класса Meta для ItemSchema, чтобы он действительно появился в сериализации.

Должно получиться так:

class CatSchema(ma.ModelSchema):
  class Meta:
    model = Category
    fields = ('id', 'name', 'status')


class ItemSchema(ma.ModelSchema):

  class Meta:
    model = Items
    fields = ('id', 'name', 'category')
  category = ma.Nested(CatSchema)

Конечно, вы можете вообще не включать атрибут fields в мета-классы, поскольку model уже занимается отображением моделей.

person Luis Orduz    schedule 13.06.2017