Python SQLAlchemy混合表达式对不同行的访问

Python SQLAlchemy混合表达式对不同行的访问,python,sqlalchemy,Python,Sqlalchemy,我有以下数据模型: class TS(Base): # Parent __tablename__ = 'ts' id = Column(Integer, primary_key=True) inspection_data = relationship('ID', backref='ts', uselist=False) 及 现在我想创建一个混合属性“状态”,告诉我下一次检查是否过期(即今天过期) 我解决了这个问题,只要: @hybrid_property

我有以下数据模型:

class TS(Base):  # Parent
    __tablename__ = 'ts'
    id = Column(Integer, primary_key=True)
    inspection_data = relationship('ID', backref='ts', uselist=False)

现在我想创建一个混合属性“状态”,告诉我下一次检查是否过期(即今天过期)

我解决了这个问题,只要:

    @hybrid_property
    def status(self):
        now = datetime.datetime.utcnow().date()
        delta = self.next_inspection - now
        if delta.days > 30:
            return 3  # OK, next inspection far away
        elif delta.days > 0:
            return 2  # Next inspection getting close
        else:  # We are overdue
            return 1
这在类和实例级别都有效,这意味着我甚至可以使用status查询。为了工作,我必须补充:

    @status.comparator
    def status(cls):
        return DateTimeComparator(cls.next_inspection)

现在我的问题是: 我想返回存储在另一个具有以下模型的表中的三个值中的一个,而不是像上面示例中那样返回状态的值1、2或3:

class IDStatusValues(Base):
    __tablename__ = 'ins_status_values'
   id = Column(Integer, primary_key=True)
   value = Column(Unicode, unique=True, nullable=True, info={})
   ID_id = Column(Integer, ForeignKey('ins.id'))
使用以下数据:

id | value
-----------
0  | 'OK'
1  | 'APPROACHING'
2  | 'OVERDUE'
也就是说,我想将status方法更改为如下内容:

   @hybrid_property
    def status(self):
        now = datetime.datetime.utcnow().date()
        delta = self.next_inspection - now
        if delta.days > 30:
            return IDStatusValues.get(0)  # OK, next inspection far away
        elif delta.days > 0:
            return IDStatusValues.get(1)  # Next inspection getting close
        else:  # We are overdue
            return IDStatusValues.get(2)
但我不明白如何在这个函数中进行查询。我承认到目前为止我只在声明性方面工作,在真正的SQL/表达性SQL炼金术方面不是很有经验

class TS(Base):  # Parent
    __tablename__ = 'ts'
    id = Column(Integer, primary_key=True)
    inspection_data = relationship('ID', backref='ts', uselist=False)`

class ID(Base):  # Child
    __tablename__ = 'ins'
    id = Column(Integer, primary_key=True)
    created = Column(Date, default=datetime.datetime.utcnow(), nullable=False)
    next_inspection = Column(Date, unique=False, nullable=True)
    ts_id = Column(Integer, ForeignKey('ts.id'))
    IDStatusValues = relationship('IDStatusValues') **# Add this relationship**

    @hybrid_property
    def status(self):
        now = datetime.datetime.utcnow().date()
        delta = self.next_inspection - now
        if delta.days > 30:
            return self.IDStatusValues.property.table.c.id == 0  # OK, next inspection far away
        elif delta.days > 0:
            return self.IDStatusValues.property.table.c.id == 1  # Next inspection getting close
        else:  # We are overdue
            return self.IDStatusValues.property.table.c.id == 2`

class IDStatusValues(Base):
    __tablename__ = 'ins_status_values'
    id = Column(Integer, primary_key=True)
    value = Column(Unicode, unique=True, nullable=True, info={})
    ID_id = Column(Integer, ForeignKey('ins.id'))`

session.query(ID).filter(ID.status).all()
   @hybrid_property
    def status(self):
        now = datetime.datetime.utcnow().date()
        delta = self.next_inspection - now
        if delta.days > 30:
            return IDStatusValues.get(0)  # OK, next inspection far away
        elif delta.days > 0:
            return IDStatusValues.get(1)  # Next inspection getting close
        else:  # We are overdue
            return IDStatusValues.get(2)
class TS(Base):  # Parent
    __tablename__ = 'ts'
    id = Column(Integer, primary_key=True)
    inspection_data = relationship('ID', backref='ts', uselist=False)`

class ID(Base):  # Child
    __tablename__ = 'ins'
    id = Column(Integer, primary_key=True)
    created = Column(Date, default=datetime.datetime.utcnow(), nullable=False)
    next_inspection = Column(Date, unique=False, nullable=True)
    ts_id = Column(Integer, ForeignKey('ts.id'))
    IDStatusValues = relationship('IDStatusValues') **# Add this relationship**

    @hybrid_property
    def status(self):
        now = datetime.datetime.utcnow().date()
        delta = self.next_inspection - now
        if delta.days > 30:
            return self.IDStatusValues.property.table.c.id == 0  # OK, next inspection far away
        elif delta.days > 0:
            return self.IDStatusValues.property.table.c.id == 1  # Next inspection getting close
        else:  # We are overdue
            return self.IDStatusValues.property.table.c.id == 2`

class IDStatusValues(Base):
    __tablename__ = 'ins_status_values'
    id = Column(Integer, primary_key=True)
    value = Column(Unicode, unique=True, nullable=True, info={})
    ID_id = Column(Integer, ForeignKey('ins.id'))`

session.query(ID).filter(ID.status).all()