Flask-SQLAlchemy と Flask-Marshmallow を使用していますが、理解できない Marshmallow の動作が見られます。
私は、うまく機能する単純な多対1のSQLAlchemyを持っています。リレーションシップの片側は、LEFT OUTER JOIN を介して取得されます。私のマッピングは次のようになります。
class Parent(db.Model):
__tablename__ = 'parents'
id = db.Column(db.Integer, primary_key=True)
child_id = db.Column(db.Integer, db.ForeignKey('children.id'))
child = db.relationship('Child', backref='parents', lazy='joined')
class Child(db.Model):
__tablename__ = 'children'
id = db.Column(db.Integer, primary_key=True)
これまでのところ、すべてがうまく機能し、期待どおりにロードされます。
しかし、Marshmallow でクエリを実行してシリアル化すると、子が既に読み込まれているにもかかわらず、すべての親の子を取得するために SELECT が実行されます。
def get_parents():
# use Flask's paginate() method
parents = Parent.query.paginate(1, 20, False)
# so far so good...LEFT OUTER JOIN is done...
# BOOM below!
return parent_paged_list_schema.dump(parents).data
Marshmallow のシリアル化プロセスが、既にメモリにある子を使用しないのはなぜですか?
私は確かに何か間違ったことをしています。
参考までに、私のマシュマロ スキーマは次のようになります。
class ParentSchema(ma.ModelSchema):
id = fields.Integer()
child = fields.Nested(ChildSchema())
class Meta:
model = Parent
class ChildSchema(ma.ModelSchema):
id = fields.Integer()
class Meta:
model = Child
class PagedListSchema(Schema):
# ...snip...
pages = fields.Integer(dump_to='numPages', dump_only=True)
per_page = fields.Integer(dump_to='perPage', dump_only=True)
total = fields.Integer(dump_to='totalItems', dump_only=True)
class ParentPagedListSchema(PagedListSchema):
items = fields.Nested(ParentSchema, many=True, dump_only=True)
parent_paged_list_schema = ParentPagedListSchema()