SQLAlchemy混合表达式对differ的访问

2024-10-04 03:20:36 发布

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

我有以下数据模型:

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

以及

^{2}$

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

我解决了这个问题:

    @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.comparator
    def status(cls):
        return DateTimeComparator(cls.next_inspection)

class DateTimeComparator(Comparator):
    def __gt__(self, other):
        return self.__clause_element__() > other
    # same for __lt__, __eq__ etc

现在来回答我的问题: 我不想像上面的例子那样返回状态值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/expressive sqlalchemy不是很有经验。在


Tags: selfidtruedatetimereturndefstatuscolumn
1条回答
网友
1楼 · 发布于 2024-10-04 03:20:36
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()

相关问题 更多 >