Sqlalchemy关系:通过连接表对子项进行排序

3

我有以下关系:一个课程有许多课程实例,每个课程实例属于一个学期

这是一个非常简化的模型集:

class Course(db.Model):
    __tablename__ = "courses"

    id = Column(Integer, primary_key=True)

    course_instances = relationship("CourseInstance", back_populates="course")


class CourseInstance(db.Model):
    __tablename__ = "course_instances"

    id = Column(Integer, primary_key=True)
    course_id = Column(Integer, ForeignKey("courses.id"))
    semester_id = Column(Integer, ForeignKey("semesters.id"))

    course = relationship("Course", back_populates="course_instances")
    semester = relationship("Semester", back_populates="course_instances")


class Semester(db.Model):
    __tablename__ = "semesters"

    id = Column(Integer, primary_key=True)
    sort_ix = Column(Integer)

    course_instances = relationship("CourseInstance", back_populates="semester")

我经常查询课程并包含所有实例,使用joinedload/contains_eager/selectinload。这些实例应该始终按照每个实例学期的sort_ix列进行排序。

有没有办法在课程模型级别上指定此默认排序?类似于以下内容:

course_instances = relationship(
    "CourseInstance",
    back_populates="course",
    order_by="CourseInstance.semester.sort_ix"
)

我唯一能想到的是在CourseInstance中添加一个重复的列,例如semester_sort_ix

1
我觉得这可能是一个重复的问题,链接为https://dev59.com/TXjZa4cB1Zd3GeqPc1qp,但它有一个悬赏,所以不能关闭。 - undefined
1
你说得对。不确定为什么我在搜索时找不到那个问题。既然我无法关闭,我就回答了自己的问题。 - undefined
1个回答

3

这是一个与不同关系的相似问题,下面是解决方案:

class CourseInstance(db.Model):
    semester_sort_ix = deferred(select([Semester.sort_ix]).where(Semester.id == semester_id))


class Course(db.Model):
    course_instances = relationship(
        "CourseInstance", back_populates="course", order_by="desc(CourseInstance.semester_sort_ix)",
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接