【发布时间】:2015-08-21 03:00:52
【问题描述】:
我有两个通过多对多关系连接的类:Parent 和 Tag。
Base = declarative_base()
association_table = Table('associations', Base.metadata,
Column('parent_id', Integer, ForeignKey('parent.id')),
Column('tag_id', Integer, ForeignKey('tag.id')),
)
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, Sequence('tag_id_seq'), primary_key=True)
name = Column(String)
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, Sequence('parent_id_seq'), primary_key=True)
tags = relationship('Tag', secondary=association_table, backref='parents')
如果我想查询与Parent 有一个或多个关系的所有Tag 对象,我会这样做:
session.query(Tag).filter(Tag.parents.any()).all()
但是,这个Parent 类是子类Alice 和Bob 的父类:
class Alice(Parent):
__tablename__ = 'alices'
__mapper_args__ = {'polymorphic_identity': 'alice'}
alice_id = Column(Integer, ForeignKey('parents.id'), primary_key=True)
class Bob(Parent):
__tablename__ = 'bobs'
__mapper_args__ = {'polymorphic_identity': 'bob'}
bob_id = Column(Integer, ForeignKey('parents.id'), primary_key=True)
现在我希望能够检索与Alice 对象具有一个或多个关系的所有Tag 对象。前面的查询 session.query(Tag).filter(Tag.parents.any()).all() 不会这样做,因为它不区分 Alice 或 Bob 对象 - 它甚至不知道它们的存在。
我已经搞砸了 Query 一段时间但没有成功,所以我假设如果可以完成,它必须与 Table 类中的一些额外代码行有关,如上所示。虽然文档包含有关 polymorphic classes 和 many-to-many relations 的信息,并且 Mike Bayer 本人向某人 this 提供了一个看似相关的问题的答案,这个问题看起来很有趣,但我还远远不能理解,但我有点卡住了。
这些代码示例可能会让 Python 解释器感到厌恶,但希望能理解我的意思。给那些可以在我的路上帮助我的人!
【问题讨论】:
-
我注意到您没有从标签到父级的反向关系。如果你有那种关系。难道你不能访问每个标签的所有父母。然后检查每个父对象与 Alice 对象的关系?
-
有一个,在父类中定义:
tags = relationship('Tag', secondary=association_table, backref='parents')。我已经完成了某种关系检查,例如执行额外的filter(Parent.id == Alice.alice_id),但这对最终过滤的影响为零(与 bob 相关的标签仍然存在)
标签: python sqlalchemy