Say I have a student
who completes exams
.
class Exams(Base):
__tablename__ = 'questions'
idx: Mapped[int] = mapped_column(primary_key=True)
passed: Mapped["bool"] = mapped_column()
student: Mapped["student"] = relationship(back_populates="student")
student_id: Mapped[int] = mapped_column(ForeignKey("student.idx"))
class Student(Base):
__tablename__ = 'homework'
idx: Mapped[int] = mapped_column(primary_key=True)
answered_correctly: Mapped["bool"] = mapped_column()
exams: Mapped[list["Exams"]] = relationship(
back_populates="student", default_factory=list
)
@hybrid_property
def passed_exams(self) -> list[exams]:
return all([exams for exam in self.exams if exam.passed])
I want to use the hybrid property in queries like so:
stmt = select(Student.passed_exams).where(Student.name == 'Joe Bloggs')
The query here is simple & could be achieved with a different query - however, if Exam
has more complex attributes like different subjects & completion dates, I want to be able to capture that in a hybrid property/method.
In order to use the hybrid property in queries, I need to implement inplace.expression
. From what I understand, the expression should return the WHERE
clause criteria that returns the desired rows. But in this case, I want to select on a different table than the one belonging to the hybrid property.
How can I get the hybrid property to work? Or am I misunderstanding how property is supposed to work?