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

如何在ORM查询中进行跨关系关联?根据A模型属性查询C模型数据

基于SQLAlchemy实现跨祖孙模型查询

方法一:为模型添加关联关系(推荐,语法更简洁)

先给三个模型补充relationship属性,让SQLAlchemy自动处理层级关联:

class A(db.Model):
    __tablename__ = "a"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    # 关联B模型的一对多关系
    bs = db.relationship("B", back_populates="a")

class B(db.Model):
    __tablename__ = "b"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    a_id = db.Column(db.Integer, db.ForeignKey("a.id"))
    # 关联A模型的反向关系
    a = db.relationship("A", back_populates="bs")
    # 关联C模型的一对多关系
    cs = db.relationship("C", back_populates="b")

class C(db.Model):
    __tablename__ = "c"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    b_id = db.Column(db.Integer, db.ForeignKey("b.id"))
    # 关联B模型的反向关系
    b = db.relationship("B", back_populates="cs")

添加关系后,就能用类似Django的跨层级语法查询:

# 查询A的name为'a'的所有C数据
result = C.query.filter(C.b.a.name == 'a').all()

# 也可以显式JOIN,效果一致
result = C.query.join(C.b).join(B.a).filter(A.name == 'a').all()

方法二:不修改模型,手动JOIN查询

如果不想改动现有模型结构,直接通过外键手动构建关联查询:

# 查询A的name为'a'的所有C数据
result = db.session.query(C)\
    .join(B, C.b_id == B.id)\
    .join(A, B.a_id == A.id)\
    .filter(A.name == 'a')\
    .all()

通用查询示例(适配A的任意字段)

比如查询A的id为1的所有C数据:

# 方法一(带关联关系)
result = C.query.filter(C.b.a.id == 1).all()

# 方法二(手动JOIN)
result = db.session.query(C).join(B).join(A).filter(A.id == 1).all()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:12:23