在sqlalchemy中筛选一对多集合的最新记录

2024-04-24 18:44:08 发布

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

我有以下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,当用户打开警报时,不需要任何原因,因此原因id可以为空。你知道吗

我想能够过滤警报,目前关闭了一个特定的原因文本,但无法找到正确的连接。你知道吗

我会从这个开始

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

但这会给我带来所有警报,过去或现在有一段时间是以“通缉理由”关闭的。如何仅使用当前状态(即每个警报的最新记录)进行筛选


Tags: selfidbase状态原因columninteger警报