Repository navigation
Return a Column class for relationship attributes that require it #107
Copy link
Copy link
Closed
Labels
featureNew feature or requestNew feature or request
Description
Activity
Maybe something like this would work ...
owner_id : Optional[int] = Field(foreign_key="users.id") owner: Optional["User"] = Relationship( sa_relationship_kwargs={ 'foreign_keys': owner_id.as_sa_column })I've encountered the same issue and after reading this SQLAlchemy guide I've managed to work around it.
Based to the guide your code should look like this:
class UpsertByModelMixin(SQLModel): created_by_id : Optional[int] = Field(default=None, foreign_key="users.id") created_by: Optional["User"] = Relationship(sa_relationship_kwargs={ 'foreign_keys': '[UpsertByModelMixin.created_by_id]' }) updated_by_id : Optional[int] = Field(default=None, foreign_key="users.id") updated_by: Optional["User"] = Relationship(sa_relationship_kwargs={ 'foreign_keys': '[UpsertByModelMixin.updated_by_id]' })
Reacted by Alex Tremblayit would be nice if
Relationshiphad alocal_keyparam to handle this, to avoid a lot of boilerplate.Ex, instead of
from sqlmodel import Field, Relationship, SQLModel class User(SQLModel, table=True): ... class Example(SQLModel, table=True): id: int = Field(primary_key=True) adminc: str | None = Field(default=None, foreign_key="users.username") techc: str | None = Field(default=None, foreign_key="users.username") adminc_alt: str | None = Field(default=None, foreign_key="users.username") techc_alt: str | None = Field(default=None, foreign_key="users.username") admin_contact: User | None = Relationship(sa_relationship_kwargs={"foreign_keys": 'Network.adminc'}) tech_contact: User | None = Relationship(sa_relationship_kwargs={"foreign_keys": 'Network.techc'}) admin_contact_alt: User | None = Relationship(sa_relationship_kwargs={"foreign_keys": 'Network.adminc_alt'}) tech_contact_alt: User | None = Relationship(sa_relationship_kwargs={"foreign_keys": 'Network.techc_alt'})
It would be nice to be able to write
from sqlmodel import Field, Relationship, SQLModel class User(SQLModel, table=True): ... class Example(SQLModel, table=True): id: int = Field(primary_key=True) adminc: str | None = Field(default=None, foreign_key="users.username") techc: str | None = Field(default=None, foreign_key="users.username") adminc_alt: str | None = Field(default=None, foreign_key="users.username") techc_alt: str | None = Field(default=None, foreign_key="users.username") admin_contact: User | None = Relationship(local_key='adminc') tech_contact: User | None = Relationship(local_key='techc') admin_contact_alt: User | None = Relationship(local_key='adminc_alt') tech_contact_alt: User | None = Relationship(local_key='techc_alt')
- locked and limited conversation to collaborators
on Aug 13, 2025
Metadata
Metadata
Assignees
Labels
featureNew feature or requestNew feature or request
First Check
Commit to Help
Example Code
| sqlalchemy.exc.ArgumentError: Column expression expected for argument 'foreign_keys'; got FieldInfo(default=PydanticUndefined, extra={'exclude': None, 'include': None}).
Alternatives
No response
Operating System
Linux
Operating System Details
No response
SQLModel Version
0.0.4
Python Version
3.9.5
Additional Context
No response