如何使用SQLAlchemy向关系添加自动筛选器?

2024-05-15 01:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是SQLAlchemy 0.5rc,我想为一个关系添加一个自动过滤器,这样每当它试图获取该关系的记录时,如果“远程”被标记为“逻辑删除”(子表的一个布尔字段),它就会忽略这些“远程”的记录

例如,如果一个对象“parent”有一个“children”关系 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呢?在


Tags: and对象idfalse远程sqlalchemy关系记录
3条回答

but is there a way to use a string as primaryjoin instead?

您可以使用以下方法:

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

这对我有用!在

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

您也可以使用一个字符串作为text()构造函数的主联接,但这将使您的代码因急切加载和联接而出现的任何表别名中断。在

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

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

我目前只在开发0.4版本的软件,但我建议如下:

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

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

(注意:在web浏览器中编写,而不是真正的代码!)在

相关问题 更多 >

    热门问题