我有两个模型,与多对多相关,其中一个是分层模型:
#hierarchical model
class Tag(Base):
__tablename__ = "tags"
id = Column(Integer, primary_key=True)
name = Column(String)
Tag.parent_id = Column(Integer, ForeignKey(Tag.id, ondelete='CASCADE'))
Tag.childs = relationship(Tag, backref=backref('parent', remote_side=[Tag.id]),
cascade="all, delete")
class Subject(Base):
__tablename__ = "subjects"
id = Column(Integer, primary_key=True, doc="ID")
name = Column(String)
tags = relationship(Tag, secondary="tags_subjects", backref="subjects")
#many-to-many relations model
class TagsSubjects(Base):
__tablename__ = "tags_subjects"
id = Column(Integer, primary_key=True)
tag_id = Column(Integer, ForeignKey("tags.id"))
subject_id = Column(Integer, ForeignKey("subjects.id"))
所以,我将尝试解释我想要做什么......我想进行一个(或几个)查询,以搜索所有主题的对象,这些对象具有像 'foo' 这样的“名称”字段值或具有相关标签的具有诸如“foo”之类的值的名称或具有相关标签的名称,该名称具有一个或多个父级(或按层次结构高于)具有诸如“foo”之类的“名称”值的标签
我试过这样做:
>>> subjects = session.query(Subject).filter(or_(
Subject.name.ilike('%{0}%'.format('foo')),
Subject.tags.any(
Tag.name.ilike('%{0}%'.format('foo')))
)).order_by(Subject.name).all()
但它不是正确和“扁平”的查询,没有分层功能:(如何通过 SQLAlchemy 的 API 做到这一点?谢谢!
PS 我正在使用 SQLite 后端