Following the polymorphic inheritance setup given by sqlalchemy docs here, how do I add a query function to the company table that returns its managers’ names?
It would look something like this, but I cannot figure out how to make it work
from sqlalchemy.orm import selectin_polymorphic
class Company(Base):
(...)
def manager_names(self):
# this doesn't work
loader_opt = selectin_polymorphic(Employee, [Manager])
return [i.name for i in self.employee.options(loader_opt).all()]
Here is the relevant part of the setup (copied from the link above):
from sqlalchemy import create_engine
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
class Base(DeclarativeBase):
pass
class Company(Base):
__tablename__ = "company"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
employees: Mapped[List["Employee"]] = relationship(back_populates="company")
class Employee(Base):
__tablename__ = "employee"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
type: Mapped[str]
company_id: Mapped[int] = mapped_column(ForeignKey("company.id"))
company: Mapped[Company] = relationship(back_populates="employees")
def __repr__(self):
return f"{self.__class__.__name__}({self.name!r})"
__mapper_args__ = {
"polymorphic_identity": "employee",
"polymorphic_on": "type",
}
class Manager(Employee):
__tablename__ = "manager"
id: Mapped[int] = mapped_column(ForeignKey("employee.id"), primary_key=True)
manager_name: Mapped[str]
__mapper_args__ = {
"polymorphic_identity": "manager",
}