我有以下示例。调用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")
答案 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
希望这会有所帮助。