1

多対多に関連する 2 つのモデルがあり、そのうちの 1 つは階層モデルです。

#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」のような「name」フィールド値を持つ、または関連するタグを持つすべての Subject のオブジェクトを検索するために、1 つ (または複数) のクエリを作成したいと思います。 'foo' のような値を持つ名前、または関連するタグを持ち、'foo' のような 'name' 値を持つ 1 つ以上の親 (または階層の上位) タグを持つ名前

私はこのようなことをしようとしました:

>>> 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バックエンドを使用しています

4

0 に答える 0