在连接模型的属性上过滤SQL Alchemy结果

1 投票
2 回答
1118 浏览
提问于 2025-04-17 03:58

我有两个模型,分别叫做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()

关于使用 filterfilter_by 的区别,可以参考 这个问题

撰写回答