Вложенные отношения "один ко многим" sqlalchemy фильтрация
Я пытаюсь фильтровать вложенные отношения один ко многим в sqlalchemy, но он дает фильтр только во внутреннем соединении (второе соединение), как я могу указать фильтр во внешнем соединении, а не во внутреннем?
У меня есть
- one-to-many school -->classes
- 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()