【问题标题】:Nested one-to-many relationship sqlalchemy filtering嵌套的一对多关系 sqlalchemy 过滤
【发布时间】:2021-12-17 14:58:34
【问题描述】:

我试图在 sqlalchemy 中过滤嵌套的一对多关系,但它只在内部连接(第二个)中提供过滤器,我如何在外部连接而不是内部连接中指定过滤器?

我有

  1. 一对多学校 -->课程
  2. 一对多班级 -> 学生

我试图让特定学校、特定班级的所有学生

模型.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()

输出为所有学生提供与其相关的所有信息,我的查询有什么问题?

【问题讨论】:

    标签: django sqlalchemy


    【解决方案1】:

    问题是我正在使用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()
    

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2020-11-22
      • 2017-03-02
      • 2016-08-23
      相关资源
      最近更新 更多