python - 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,但我无法让它们工作。你能帮我一把吗?
解决方案
尝试limit(1)
代替first
. 一个用于 ORM,另一个用于核心(您正在使用)
推荐阅读
- vba - 使用 ctrl+shift+down 函数 aka Selection.End(x1down) 进行动态复制和粘贴
- antlr4 - Antlr4 语法不会解析多行输入
- django - Django - 未找到“list1”的反向。“list1”不是有效的视图函数或模式名称
- python - django 语言环境未正确加载
- java - Java 流按列表分组
- python - 在熊猫中按列值触发结果
- jenkins - 如何在我的詹金斯管道中获得“parentNumber”?
- donejs - 首先尝试 DoneJS - 聊天演示不起作用
- visual-studio-code - Visual Studio Code:switch-case 块内容缩进
- python - Django urlpatterns 设置