首页 > 解决方案 > SQLAlchemy:混合属性,先排序并返回

问题描述

假设我有以下模型。披萨的状态可以多次更新,但我希望我的披萨模型有一个latest_status返回最新状态的:

class PizzaStatus(Base):
    updated_at = Column(DateTime, nullable=False, server_default=func.now())
    type = Column(Integer, nullable=False)
    pizza_id = Column(Integer, ForeignKey("pizzas.id"))


class Pizza(Base):

    id = Column(Integer, primary_key=True)

    # Always load the statuses when querying an object
    statuses = relationship("PizzaStatus", backref="pizza", lazy="selectin")

    @typed_hybrid_property
    def latest_status(self):
        return max(self.statuses, key= lambda status: status.updated_at)

    @latest_status.expression
    def latest_status(cls):
        return select([Pizza.statuses]).where(PizzaStatus.pizza_id == cls.id).order_by(desc(PizzaStatus.updated_at)).first()

当我获取一个Pizza对象时,我可以这样做:

pizza = session.query(Pizza).all()
pizza.latest_status

这意味着在作品的实例级别上实现的混合属性Pizza

但是,我不能这样做:

session.query(Pizza).filter(Pizza.latest_status.type.in_(1, 2, 3, 4))

我收到此错误:

AttributeError: 'Select' object has no attribute 'first'

这是我想要实现的目标:Pizza从我的数据库中查询对象时,我想根据披萨的最新状态过滤它们。我希望这些状态位于有效状态类型列表中。我尝试过这样的方法:sqlalchemy hybrid_attribute expression,但我无法让它们工作。你能帮我一把吗?

标签: pythonsqlalchemy

解决方案


尝试limit(1)代替first. 一个用于 ORM,另一个用于核心(您正在使用)


推荐阅读