You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@hybrid_property的expression中添加多表case语句

问题原因

你在@date_time_hybrid.expression装饰的类级表达式方法中,直接通过关系属性cls.tbl_child_rel访问子表字段date_time是非法操作。关系属性在SQL表达式上下文中不会自动完成表关联映射,本身也不携带子表的字段属性,因此抛出了属性不存在的异常。

修复方案

需要分别补全实例级的hybrid_property逻辑,同时将表达式级逻辑改为通过关联子查询获取子表字段值,修改后的核心代码如下:
首先新增必要导入:

from sqlalchemy import func, select

修改TblParent类中的hybrid_property定义:

class TblParent(Base):
    __tablename__ = "tbl_parent"
    __table_args__ = {"schema": "test"}

    id_ = Column(Integer, primary_key=True)
    date_time = Column(DateTime)

    tbl_child_rel = relationship("TblChild", back_populates="tbl_parent_rel", uselist=False)

    @hybrid_property
    def date_time_hybrid(self):
        # 实例层面逻辑:直接判断关联对象是否存在
        if self.tbl_child_rel:
            return self.tbl_child_rel.date_time
        return self.date_time

    @date_time_hybrid.expression
    def date_time_hybrid(cls):
        # 表达式层面逻辑:通过关联子查询取对应子表的时间值
        child_dt_subq = (
            select(TblChild.date_time)
            .where(TblChild.tbl_parent_id == cls.id_)
            .scalar_subquery()
        )
        # coalesce会返回第一个非空值,替代case简化逻辑
        return func.coalesce(child_dt_subq, cls.date_time)
验证效果

修改后执行session.query(TblParent.date_time_hybrid).all()即可正常返回结果:关联了子表的父记录返回子表的datetime值,未关联子表的父记录返回自身的datetime值。

内容的提问来源于stack exchange,提问作者Jossy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:00:01