10

我正在使用 SQLAlchemy 0.5rc,并且我想向关系添加一个自动过滤器,以便每次尝试获取该关系的记录时,如果它们被标记为“逻辑上已删除”,它将忽略“远程”记录"(子表的布尔字段)

例如,如果一个对象“父”有一个“子”关系,它有 3 条记录,但其中一条在逻辑上被删除,当我查询“父”时,我希望 SQLA 获取只有两个子的父对象。 .
我应该怎么做?通过向关系的primaryjoin参数添加“and”条件?(例如“ Children.parent_id == Parent.id and Children.logically_deleted == False”,但是这样写“and”是否正确?)

编辑:
我设法以这种方式做到了

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

但是有没有办法将字符串用作primaryjoin?

4

3 回答 3

10

但是有没有办法将字符串用作primaryjoin?

您可以使用以下内容:

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

这对我有用!

于 2012-12-14T23:51:38.140 回答
4

and_() 函数是在 SQLAlchemy 中与 & 运算符一起进行逻辑连接的正确方法,但要小心后者,因为它具有令人惊讶的优先级规则,即比比较运算符具有更高的优先级。

您还可以将字符串用作 text() 构造函数的主要连接,但这会使您的代码因急切加载和连接附带的任何表别名而中断。

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

mapper(Something, select([sometable], sometable.c.deleted == False))
于 2008-11-10T18:23:30.197 回答
0

我目前只是在再次开发 0.4.something,但我的建议如下:

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

我想这就是你想要做的,对吧?

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

于 2008-11-06T08:48:54.257 回答