当SQLAlchemy映射急切时,为什么Marshmallow会创建额外的查询

时间:2016-05-14 11:41:11

标签: flask sqlalchemy flask-sqlalchemy marshmallow

我正在使用Flask-SQLAlchemy和Flask-Marshmallow,我看到了我不明白的Marshmallow行为。

我有一个简单的多对一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的序列化过程不仅仅使用已经在内存中的孩子?

我肯定做错了。

以下是我的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()

0 个答案:

没有答案