SQLAlchemy:如何在场上过滤几个深层次的关系?

SQLAlchemy:如何在场上过滤几个深层次的关系?,sqlalchemy,Sqlalchemy,我有一个分层的数据库结构,我想在几个层次(关系)深的字段上使用过滤器进行查询 下面是类声明的示例: class cTransfer(Base): __tablename__ = 'mesTransfer' transferID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False) quanID = Column(UNIQUEIDENTIFIER, ForeignKey('mesQuantum.q

我有一个分层的数据库结构,我想在几个层次(关系)深的字段上使用过滤器进行查询

下面是类声明的示例:

class cTransfer(Base):
    __tablename__ = 'mesTransfer'
    transferID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False)
    quanID = Column(UNIQUEIDENTIFIER, ForeignKey('mesQuantum.quanID'))
    quanObj = relationship('cQuantum', foreign_keys=[quanID], lazy='joined')

class cQuantum(Base):
    __tablename__ = 'mesQuantum'
    quanID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False)
    orderItemID = Column(UNIQUEIDENTIFIER, ForeignKey('mesOrderItem.orderItemID'))
    orderItemObj = relationship('cOrderItem', foreign_keys=[orderItemID], lazy='joined')

class cOrderItem(Base):
    __tablename__ = 'mesOrderItem'
    orderItemID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False)
    orderID = Column(UNIQUEIDENTIFIER, ForeignKey('mesOrderHeader.orderID'))
    orderHeaderObj = relationship('cOrderHeader', foreign_keys=[orderID], lazy='joined')
我想获取其关联orderID在某个列表中的所有cTransfer

所以我试着这样做:

q = session.query(cTransfer).filter(cTransfer.quanObj.orderItemObj.orderID.in_([1, 2]))
我得到一个例外:“与CtrTransfer.quanObj关联的'InstrumentedAttribute'对象和'Comparator'对象都没有属性'orderItemObj'”


我怎样才能做这样的查询呢?

下面应该会有帮助。基本上,您需要在所有级别执行
join
s:

orderIDs = [1, 2]
q = (session.query(cTransfer)
     .join(cTransfer.quanObj)
     .join(cQuantum.orderItemObj)
     .filter(cOrderItem.orderID.in_(orderIDs))
     .options(contains_eager(cTransfer.quanObj).contains_eager(cQuantum.orderItemObj))
     )

选项
行提示
sqlalchemy
已加载关系,这样它就不会向
SQL
添加额外的
JOIN
已连接的
加载的关系中。

就是这样!非常感谢!:)