1

我有一个模型 X 和一个模型 Y。

Y 包含一个对 X.id 的外键引用,其中一个相关 X 条目的实例可通过属性 x 获得。

x_id = Column(Integer, ForeignKey('xtable.id'))    
x = relationship('X')

X 也有一个布尔属性“发布”。

在 Y 上执行查询,我如何将结果过滤到 x.publish 为 True 的结果;

我试过做这样的事情:

DBSession.query(Y).filter_by(x.publish = True).all() 

但这不起作用,我收到一条错误消息,说关键字不能是表达式。我查看了 sql alchemy 文档以寻找解决方案,但我似乎找不到我要找的东西。有什么建议么?

4

2 回答 2

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

于 2011-10-09T17:26:55.817 回答
3

其他选项是

您可以创建直接的新关系

喜欢

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

这将自动加入。

于 2011-10-10T10:25:42.593 回答