sql alchemy过滤器结果是已连接模型的属性

时间:2011-10-09 10:54:46

标签: python sqlalchemy relation

我有一个模型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炼金术文档的解决方案,但我似乎无法找到我正在寻找的东西。有什么建议吗?

2 个答案:

答案 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()

有关使用filterfilter_by之间的区别,请参阅this question

答案 1 :(得分:3)

其他选项是

您可以创建直接的新关系

x1 = relationship(X,
             primaryjoin='and_(X.id==Y.x_id, X.publish==True)'
             )

这会自动加入。