Как вернуть json с данными из идентификатора (таблицы соединений) с помощью Flask-Marshmallow

#python #flask #serialization #marshmallow #flask-marshmallow

Вопрос:

У меня есть класс книги и класс пользователя. Каждый пользователь может владеть несколькими книгами. Я пытаюсь использовать Marshmallow для сериализации данных между контроллером(/маршрутом) и моделью.

выходной ток составляет:

{‘идентификатор пользователя’: 2, ‘идентификатор книги’: 16}

{‘идентификатор пользователя’: 2, ‘идентификатор книги’: 17}

и я просто хочу вернуть книги, которыми владеет пользователь (в качестве данных для каждой книги, а не только идентификатор в качестве текущего результата).

Это функция, которая запускает все:

 @Users.route('/user/getbooks', methods=['POST'])
def get_user_books():
    user_books_schema = UserLibrarySchema()
    data = request.get_json()
    books = UserLibrary.get_user_books(int(data['userId']))
    print(books)
    
    for book in books : 
        print(user_books_schema.dump(book))
    return 'haha'
    # return UserLibrarySchema.dump(books)
 

модель пользователя:

 class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
    creation_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
    owner = db.relationship('UserLibrary', backref='book_owner', lazy=True)
 

Схема пользователя:

 class UsersSchema(ma.SQLAlchemySchema): 
    class Meta: 
        model = Users

    user_id = ma.auto_field(primary_key=True)
    username = ma.auto_field()
    email = ma.auto_field()
 

модель книги:

 class Books(db.Model):
    __tablename__ = 'books'    
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)
    author = db.Column(db.String(255), nullable=False)
    cover = db.Column(db.String(255), nullable=False, default='default_book.png')
    owner = db.relationship('UserLibrary', backref='owned', lazy=True)
 

book schema:

 class BooksSchema(ma.Schema): 
# class BooksSchema(ma.SQLAlchemySchema): 
    class Meta:
        model = Books

    # id = ma.auto_field()
    name = ma.auto_field()
    author = ma.auto_field()
    cover = ma.auto_field()
 

the join table:

 class UserLibrary(db.Model): 
    __tablename__ = 'library'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    book_id = db.Column(db.Integer, db.ForeignKey('books.id'), nullable=False)
 

the join table schema:

 class UserLibrarySchema(ma.SQLAlchemySchema): 

    class Meta:
        # fields = ('user_id', 'book_id', 'cover')
        model = UserLibrary
        include_fk = True

    user_id = ma.auto_field()
    book_id = ma.auto_field()
    # book_schema = BooksSchema()
    # book_id = ma.Nested(book_schema)
 

Я много возился с этим, но не нашел правильного способа сделать это.