如何从SQLAlchemy中的更改日志表的最后一行获取字段

时间:2018-10-01 20:29:16

标签: python-3.x flask-sqlalchemy

我有以下示例。调用Order.next时,我希望返回状态为NEW的单个订单。但是我正在其他OrderStatus中获得订单。

如果这很重要,请使用SQLite后端。

class OrderStatus(enum.Enum):
    NEW = 0
    MAKING = 1
    MADE = 2
    COLLECTED = 3


class Order(Base):
    __tablename__ = 'orders'
    id = Column(Integer, primary_key=True)
    updates = relationship("OrderUpdate", order_by = "OrderUpdate.position", collection_class=ordering_list('position'))

    @hybrid_method
    def next(self):
        order = Order.query                              \
            .filter(Order.status in [OrderStatus.NEW])   \
            .order_by(Order.id)                          \
            .first()
        return order

    @hybrid_property
    def status(self):
        update = OrderUpdate                        \
            .query.filter_by(order_id = self.id)    \
            .order_by(OrderUpdate.id.desc())        \
            .first()
        if update is None:
            return None
        return update.status


class OrderUpdate(Base):
    __tablename__ = 'order_updates'
    id = Column(Integer, primary_key=True)
    position = Column(Integer)
    status = Column('status', Enum(OrderStatus))
    comment = Column(String)
    order_id = Column(Integer, ForeignKey("orders.id"))
    order = relationship("Order", back_populates="updates")

1 个答案:

答案 0 :(得分:0)

我没有检查,但我认为行的问题:

.filter(Order.status in [OrderStatus.NEW])

如果需要使用in条件,则需要使用sqlalchemy in_()。因此,在您的情况下,它应该是这样的:Order.status.in_([1, 2])。另外,您也可以不使用in_()

Order.query.filter_by(Order.status=0).order_by(Order.id).first()
  

注意!关于枚举。这与Flask或Flask-SqlAlchemy无关。仅供您参考。

# Python 3.6.1

class OrderStatus(enum.Enum):
    NEW = 0

0 in [OrderStatus.NEW]  # False
0 in [OrderStatus.NEW.value]  # True

val = OrderStatus(0)
val in [OrderStatus.NEW]  # True

希望这会有所帮助。