SqlAlchemy – 通过关系属性进行过滤

我没有太多的SQLAlchemy的经验和一个问题,我不能解决,但寻找一个尝试了很多的代码。 这是我的类(简化为最重要的代码):

class Patient(Base): __tablename__ = 'patients' id = Column(Integer, primary_key=True, nullable=False) mother_id = Column(Integer, ForeignKey('patients.id'), index=True) mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False) phenoscore = Column(Float) 

我想询问所有的病人,他们的母亲的病史是(例如)== 10

据说,我尝试了很多代码,但我没有得到它。 在我看来,逻辑上的解决办法是

 patients = Patient.query.filter(Patient.mother.phenoscore == 10) 

因为你可以在输出时访问每个元素的.mother.phenoscore,但是这个代码不会这样做。 是否有(直接的)可能性根据关系的属性进行过滤(无需编写SQL语句或额外的连接语句),我需要多次这样的filter。

即使没有简单的解决办法,我对所有的答案感到高兴

非常感谢克里斯托

使用方法has()关系(更可读):

 patients = Patient.query.filter(Patient.mother.has(phenoscore=10)) 

或join(通常更快):

 patients = Patient.query.join(Patient.mother, aliased=True)\ .filter_by(phenoscore=10) 

你必须通过连接来查询关系

你会从这个自我引用查询策略中得到例子

对你来说是一个好消息:我最近制作了一个软件包,可以像Django中的 “神奇”string一样进行过滤/sorting,所以你现在可以写出类似于

 Patient.where(mother___phenoscore=10) 

这个时间要短得多,特别是对于复杂的滤波器来说,

 Comment.where(post___public=True, post___user___name__like='Bi%') 

希望你会喜欢这个包

https://github.com/absent1706/sqlalchemy-mixins#django-like-queries

我用会话,但可以直接访问关系字段的替代方法是

 db_session.query(Patient).join(Patient.mother) \ .filter(Patient.mother.property.mapper.class_.phenoscore==10) 

我没有testing过,但我猜这也可以

 Patient.query.join(Patient.mother) \ .filter(Patient.mother.property.mapper.class_.phenoscore==10)