过滤sqlalchemy中一对多集合的最新记录

时间:2017-03-05 18:39:28

标签: python join sqlalchemy

我有以下sqlalchemy模型

class Alert(Base):
    __tablename__ = 'alerts'


    id = Column(Integer, primary_key=True)
    alert_text = Column(Text)


    @hybrid_property
    def latest_state(self):
        if self.state_changes:
            return self.state_changes[-1]

        return self.state_changes


class AlertStateChange(Base):
    __tablename__ = 'alert_state_change'
    __table_args__ = (
        PrimaryKeyConstraint('id', name='pk_alert_state_change'),
    )

    id = Column(Integer)
    reason_id = Column(Integer, ForeignKey('reasons.id'))
    alert_id = Column(Integer, ForeignKey(Alert.id))
    reason = relationship('Reason', backref='state_changes')
    alert = relationship(Alert, backref='state_changes')
    status = Column(Text)
    date = Column(DateTime)



class Reason(Base):
    __tablename__ = 'reasons'
    __table_args__ = (
        PrimaryKeyConstraint('id', name='pk_reason'),

    )

    id = Column(Integer)
    reason_text = Column(Text)

所以基本上警报的状态是根据原因编辑的。当状态更改时,用户也会输入注释,并且还会保留有关用户发出更改的信息,但为了简单起见,我已将这两个字段排除在外。状态可以是openclosed,当用户打开警报时,无需理由,因此reason_id可以为null。

我希望能够过滤当前因特定原因文本而关闭但无法找到正确联接的警报。

E.g我会从这个开始

session.query(Alert).join(AlertStateChange).join(Reason).filter(Reason.reason_text=='wanted reason) 

但这会给我带来所有警报,过去或现在的某个时间以“想要的理由”结束。如何仅使用当前状态进行过滤(因此每个警报的最新记录)

0 个答案:

没有答案