Query an instrumentedattribute by its length in SQLAlchemy

165 Views Asked by At

The way the database is setup is like this. I'm using SQLModel, but underneath it's SQLAlchemy.

class Paper(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
        similar: List["PaperSimilarLink"] = Relationship(
        link_model=PaperSimilarLink,
        back_populates="similar",
        sa_relationship_kwargs=dict(
            primaryjoin="Paper.id==PaperSimilarLink.paper_id",
            secondaryjoin="Paper.id==PaperSimilarLink.similar_id",
        ),
    )

class PaperSimilarLink(SQLModel, table=True):
    paper_id: int = Field(default=None, foreign_key="paper.id", primary_key=True)
    similar_id: int = Field(default=None, foreign_key="paper.id", primary_key=True)
    paper: "Paper" = Relationship(
        back_populates="similar",
        sa_relationship_kwargs=dict(
            foreign_keys="[PaperSimilarLink.paper_id]",
        ),
    )
    similar: "Paper" = Relationship(
        back_populates="similar",
        sa_relationship_kwargs=dict(
            foreign_keys="[PaperSimilarLink.similar_id]",
        ),
    )
    similarity: Optional[float]

The query I am looking for is to look for all the Paper objects that have less than x number of PaperSimilarLinks located at Paper.similar. I've tried this:

papers = session.exec(select(Paper).where(Paper.similar.count() <= 11)).all()

It errors me out saying AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Paper.similar has an attribute 'count'

I figured this was a very simple query, but it's illuding me! How would I do this?

0

There are 0 best solutions below