题
我正在使用SQLAlchemy 0.5rc,并且我想为关系添加一个自动过滤器,这样每次它尝试获取该关系的记录时,它都会忽略“远程”。如果它们被标记为“logically_deleted”,则为(子表的布尔字段)
例如,如果对象“父”与对象“父”相同。有一个“孩子”有这样的关系
3个记录,但当我查询“父”时,其中一个记录被逻辑删除。我想要SQLA
只用两个孩子来获取父对象..
我该怎么办?通过添加“和”。条件到primaryjoin
关系的参数? (例如“ Children.parent_id == Parent.id and Children.logically_deleted == False
”,但以这种方式写“和”是否正确?)
修改强>结果 我设法以这种方式做到了
children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False))
但有没有办法将字符串用作主连接?
解决方案
and_()函数是在SQLAlchemy中执行逻辑连接的正确方法,以及&运算符,但要注意后者,因为它具有令人惊讶的优先级规则,即优先级高于比较运算符。
您还可以使用字符串作为text()构造函数的主要连接,但这会使您的代码与使用eagerloading和join连接的任何表别名一起中断。
对于逻辑删除,最好将整个类映射到忽略已删除值的选择上:
mapper(Something, select([sometable], sometable.c.deleted == False))
其他提示
但有没有办法将字符串用作主连接?
您可以使用以下内容:
children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"
这对我有用!
我目前只是开发了0.4some,但这是我的建议:
db.query(Object).filter(Object.first==value).filter(Object.second==False).all()
我认为这就是你要做的事,对吧?
(注意:用网页浏览器编写,不是真正的代码!)
不隶属于 StackOverflow