【发布时间】:2015-02-23 16:28:48
【问题描述】:
我定义了以下映射类
class A(Base):
__tablename__ = "a"
id = sqla.Column(sqla.Integer, primary_key = True)
number_a = sqla.Column(sqla.Integer)
b_collection = relationship('B', backref = backref('a'))
class B(Base):
__tablename__ = "b"
id = sqla.Column(sqla.Integer, primary_key = True)
id_a = sqla.Column(sqla.Integer, sqla.ForeignKey('a.id'))
number_b = sqla.Column(sqla.Integer)
数据库中存储了这些对象:
a1 = A(number_a = 1)
a2 = A(number_a = 2)
b1 = B(number_b = 50, a = a2)
b2 = B(number_b = 51, a = a2)
我需要的是通过仅发出一个查询来查询关系,以便它仅通过该查询的结果预加载b_collection:
result = session.query(A).join(B).filter(B.number_b == 51).all()
所以现在我希望result[0].b_collection 尊重过滤表达式并且不包括B 实例with number_b = 50。所以我的预期输出是:
for a in result:
for b in a.b_collection:
print(b.number_b)
应该是:
51
但是遍历a.b_collection 总是会发出一个新查询并将B 对象加载到b_collection 中,因此结果是
50
51
这是我不想得到的。
如何强制原始查询加载所有对象并根据给定的过滤条件填充关系集合?
感谢您的回复。
【问题讨论】:
标签: python sqlalchemy