2017-01-25 10 views
0

私は、フラスコ、フラスコ - sqlalchemyとフラスコ - マシュマロを使用して小さなREST APIを構築しています。いくつかのリクエストでは、私のsqlalchemyオブジェクトからなるjsonのシリアル化された応答を返したいと思います。しかし、多対多リレーションシップ/セカンダリ・テーブルを使用しているときには、シリアル化を熱心にロードされたsqlalchemyオブジェクトで動作させることはできません。ここで Flask Marshmallow/SqlAlchemy:多対多関係をシリアライズ

は単純な例で、多かれ少なかれコピー/フラスコ-マシュマロのドキュメントから貼り付け:私は熱心に本をロードし、同様に作家のオブジェクトを取得することができます上記のコードに基づいて
from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from flask_marshmallow import Marshmallow 
from sqlalchemy.orm import joinedload 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' 

# Order matters: Initialize SQLAlchemy before Marshmallow 
db = SQLAlchemy(app) 
ma = Marshmallow(app) 

secondary_foo = db.Table('secondary_foo', 
          db.Column('author_id', db.Integer, db.ForeignKey('author.id')), 
          db.Column('book_id', db.Integer, db.ForeignKey('book.id'))) 

class Author(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(255)) 

class Book(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(255)) 
    authors = db.relationship('Author', secondary="secondary_foo", backref='books', lazy="joined") 

class AuthorSchema(ma.ModelSchema): 
    class Meta: 
     model = Author 

class BookSchema(ma.ModelSchema): 
    #authors = ma.Nested(AuthorSchema) <-- Doesn't work, authors will be serialized to empty json object, instead of list of ids 
    class Meta: 
     model = Book 


db.drop_all() 
db.create_all() 
author_schema = AuthorSchema() 
book_schema = BookSchema() 
author = Author(name='Chuck Paluhniuk') 
book = Book(title='Fight Club') 
book.authors.append(author) 
db.session.add(author) 
db.session.add(book) 
db.session.commit() 

s = BookSchema(many=True) 

print(s.dump(Book.query.filter(1==1).options(joinedload('authors')).all()).data) 
//--> [{'authors': [{'name':'Chuck Paluhniuk', 'id':'1'}], 'title': 'Fight Club', 'id': 1}] 

一体私は:-)それを行うにはどうすればよい:

print(Book.query.filter(1==1).options(joinedload('authors')).all()[0].authors) 
//--> [<__main__.Author object at 0x1043a0dd8>] 

print(s.dump(Book.query.filter(1==1).options(joinedload('authors')).all()).data) 
//--> [{'authors': [1], 'title': 'Fight Club', 'id': 1}] 

これは私が望む結果は次のとおりです。深いオブジェクトをシリアル化するときにはIDのリストにシリアライズされますか?あなたのBookSchema

答えて

1

、あなたが持っていた(ただし、コメントアウト)しかし、あなたはそれがmany keyword argumentを使用して、リストになることを指定したいと思うようにNestedauthorsフィールドを追加したいと思うでしょう。

class BookSchema(ma.ModelSchema): 

    # A list of author objects 
    authors = ma.Nested(AuthorSchema, many=True) 

    class Meta: 
     model = Book 
+0

鮮やかな、ありがとう!私はフラスコ - マシュマロ、フラスコ - sqlalchemy、sqlalchemyとmarsmallowドキュメントを通過して終わりに時間を費やしているに違いない。 – MSurrow