如何为SQLAlchemy的关系添加自动过滤器?

时间:2008-11-06 07:33:11

标签: python sqlalchemy

我正在使用SQLAlchemy 0.5rc,我想为关系添加一个自动过滤器,这样每次它尝试获取该关系的记录时,如果它们被标记,它会忽略“远程”的关系as“logically_deleted”(子表的布尔字段)

例如,如果对象“父”具有“子”关系 3个记录,但其中一个是逻辑删除的,当我查询“父”我想要SQLA 只用两个孩子来获取父对象。
我该怎么办?通过向主连接添加“和”条件 关系的参数? (例如“Children.parent_id == Parent.id and Children.logically_deleted == False”,但以这种方式写“和”是否正确?)

修改
我设法以这种方式做到了

children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False))

但有没有办法将字符串用作主连接?

3 个答案:

答案 0 :(得分:8)

  

但有没有办法将字符串用作主连接?

您可以使用以下内容:

children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"

这对我有用!

答案 1 :(得分:3)

and_()函数是在SQLAlchemy中执行逻辑连接的正确方法,以及&运算符,但要注意后者,因为它具有令人惊讶的优先级规则,即优先级高于比较运算符。

你也可以使用一个字符串作为text()构造函数的主要连接,但是这会使你的代码破坏eagerloading和join所带来的任何表别名。

对于逻辑删除,最好将整个类映射到忽略已删除值的选择上:

mapper(Something, select([sometable], sometable.c.deleted == False))

答案 2 :(得分:0)

我目前只是开发了0.4some,但这是我的建议:

db.query(Object).filter(Object.first==value).filter(Object.second==False).all()

我认为这就是你要做的事,对吧?

(注意:用网页浏览器编写,不是真正的代码!)