我有一个模型X和一个模型Y.
Y包含对X.id的外键引用,属性x提供相关X条目的实例。
x_id = Column(Integer, ForeignKey('xtable.id'))
x = relationship('X')
X还有一个布尔属性'publish'。
在Y上执行查询,如何将结果过滤到x.publish为True的结果;
我尝试过这样的事情:
DBSession.query(Y).filter_by(x.publish = True).all()
但这不起作用,我得到一个错误,说关键字不能表达。我看了sql炼金术文档的解决方案,但我似乎无法找到我正在寻找的东西。有什么建议吗?
答案 0 :(得分:3)
您需要在查询中将join
添加到课程X
并使用filter
代替filter_by
:
qry = DBSession.query(Y)
qry = qry.join(X)
qry = qry.filter(X.publish == True)
qry.all()
或一气呵成:
DBSession.query(Y).join(X).filter(X.publish == True).all()
有关使用filter
和filter_by
之间的区别,请参阅this question。
答案 1 :(得分:3)
其他选项是
您可以创建直接的新关系
像
x1 = relationship(X,
primaryjoin='and_(X.id==Y.x_id, X.publish==True)'
)
这会自动加入。