# There's a SQLAlchemy relationship declared, that takes precedence
# over anything else, use that and continue with the next attribute
dict_used[rel_name] = rel_info.sa_relationship
+ setattr(cls, rel_name, rel_info.sa_relationship) # Fix #315
continue
ann = cls.__annotations__[rel_name]
temp_field = ModelField.infer(
-from typing import Optional\r
+from typing import List, Optional\r
\r
import pytest\r
from sqlalchemy.exc import IntegrityError\r
-from sqlmodel import Field, Session, SQLModel, create_engine\r
+from sqlalchemy.orm import RelationshipProperty\r
+from sqlmodel import Field, Relationship, Session, SQLModel, create_engine\r
\r
\r
def test_should_allow_duplicate_row_if_unique_constraint_is_not_passed(clear_sqlmodel):\r
session.add(hero_2)\r
session.commit()\r
session.refresh(hero_2)\r
+\r
+\r
+def test_sa_relationship_property(clear_sqlmodel):\r
+ """Test https://github.com/tiangolo/sqlmodel/issues/315#issuecomment-1272122306"""\r
+\r
+ class Team(SQLModel, table=True):\r
+ id: Optional[int] = Field(default=None, primary_key=True)\r
+ name: str = Field(unique=True)\r
+ heroes: List["Hero"] = Relationship( # noqa: F821\r
+ sa_relationship=RelationshipProperty("Hero", back_populates="team")\r
+ )\r
+\r
+ class Hero(SQLModel, table=True):\r
+ id: Optional[int] = Field(default=None, primary_key=True)\r
+ name: str = Field(unique=True)\r
+ team_id: Optional[int] = Field(default=None, foreign_key="team.id")\r
+ team: Optional[Team] = Relationship(\r
+ sa_relationship=RelationshipProperty("Team", back_populates="heroes")\r
+ )\r
+\r
+ team_preventers = Team(name="Preventers")\r
+ hero_rusty_man = Hero(name="Rusty-Man", team=team_preventers)\r
+\r
+ engine = create_engine("sqlite://", echo=True)\r
+\r
+ SQLModel.metadata.create_all(engine)\r
+\r
+ with Session(engine) as session:\r
+ session.add(hero_rusty_man)\r
+ session.commit()\r
+ session.refresh(hero_rusty_man)\r
+ # The next statement should not raise an AttributeError\r
+ assert hero_rusty_man.team\r
+ assert hero_rusty_man.team.name == "Preventers"\r