Вложенные отношения "один ко многим" sqlalchemy фильтрация

Я пытаюсь фильтровать вложенные отношения один ко многим в sqlalchemy, но он дает фильтр только во внутреннем соединении (второе соединение), как я могу указать фильтр во внешнем соединении, а не во внутреннем?

У меня есть

  1. one-to-many school -->classes
  2. one-to-many class -> student

Я пытаюсь получить всех учеников в определенной школе, в определенном классе

Models.py

class School(Base):
    __tablename__ = 'schools'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    #  # Relationship for one-many - parent of classes
    classes = relationship("Class")

    def __repr__(self):
        return "<School(name='%s')>" % self.name

class Class(Base):
    __tablename__ = 'classes'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    # foreign Key for the parent - child of school
    school_id = Column(Integer, ForeignKey('schools.id'))
    # Relationship for one-many - parent of students
    students = relationship("Student")

    def __repr__(self):
        return "<Class(name='%s')>" % self.name

class Student(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)
    # foreign Key for the parent - child of school
    class_id = Column(Integer, ForeignKey('classes.id'))

    def __repr__(self):
        return "<Student(name='%s', fullname='%s', nickname='%s')>" % (
            self.name, self.fullname, self.nickname)

запрос является

info = session.query(SchoolModel). \
                options(subqueryload(SchoolModel.classes).subqueryload(ClassModel.students)). \
                filter(SchoolModel.id == parent_lookup_class__student). \
                filter(ClassModel.id == parent_lookup_class). \
                filter(StudentModel.id == pk). \
                first()

Вывод дает всех студентов со всей информацией, связанной с ними, что не так с моим запросом?

проблема в том, что я использую subqueryload и его нельзя изменить, вместо этого я использовал contains_eager() для фильтрации результатов. новый запрос

 info = session.query(SchoolModel). \
            join(SchoolModel.classes). \
            join(ClassModel.students). \
            options(contains_eager(SchoolModel.classes), contains_eager(SchoolModel.classes, ClassModel.students)). \
            filter(SchoolModel.id == parent_lookup_class__student). \
            filter(ClassModel.id == parent_lookup_class). \
            filter(StudentModel.id == pk). \
            populate_existing(). \
            first()
Вернуться на верх