#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)
Я много возился с этим, но не нашел правильного способа сделать это.