Jor*_*ril 10 python sqlalchemy
我正在使用SQLAlchemy 0.5rc,并且我想为一个关系添加一个自动过滤器,这样每次它尝试获取该关系的记录时,如果它们被标记为"logically_deleted",它将忽略"远程"的那些"(子表的布尔字段)
例如,如果一个对象"parent"具有一个具有3条记录的"children"关系,但其中一条逻辑被删除,那么当我查询"Parent"时,我希望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))
Run Code Online (Sandbox Code Playgroud)
但有没有办法使用字符串作为主要连接?
但有没有办法使用字符串作为主要连接?
您可以使用以下内容:
children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"
Run Code Online (Sandbox Code Playgroud)
这对我有用!
and_() 函数是在 SQLAlchemy 中与 & 运算符一起执行逻辑连接的正确方法,但要小心后者,因为它具有令人惊讶的优先级规则,即比比较运算符更高的优先级。
您还可以使用字符串作为 text() 构造函数的主要联接,但这将使您的代码因预加载和联接附带的任何表别名而中断。
对于逻辑删除,最好将整个类映射到忽略已删除值的选择上:
mapper(Something, select([sometable], sometable.c.deleted == False))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2042 次 |
最近记录: |