在连接模型的属性上过滤SQL Alchemy结果
我有两个模型,分别叫做X和Y。
Y模型里有一个外键,指向X模型的id,也就是说Y可以通过属性x找到相关的X实例。
x_id = Column(Integer, ForeignKey('xtable.id'))
x = relationship('X')
X模型还有一个布尔类型的属性'publish',也就是它可以是“真”或者“假”。
现在我想在查询Y的时候,筛选出那些对应的X的'publish'属性为真的结果。
我试过这样做:
DBSession.query(Y).filter_by(x.publish = True).all()
但是这样不行,我收到一个错误提示,说关键字不能是表达式。我查过SQLAlchemy的文档,但找不到我想要的解决办法。有没有什么建议?
2 个回答
3
另一种选择是
你可以直接创建新的关系
比如说
x1 = relationship(X,
primaryjoin='and_(X.id==Y.x_id, X.publish==True)'
)
这样做会自动进行连接。
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
的区别,可以参考 这个问题。