1from typing import List 2from typing import Optional 3 4from sqlalchemy import Column 5from sqlalchemy import ForeignKey 6from sqlalchemy import Integer 7from sqlalchemy import select 8from sqlalchemy import String 9from sqlalchemy.orm import declarative_base 10from sqlalchemy.orm import Mapped 11from sqlalchemy.orm import relationship 12 13Base = declarative_base() 14 15 16class User(Base): 17 __tablename__ = "user" 18 19 id = Column(Integer, primary_key=True) 20 name = Column(String) 21 22 addresses: Mapped[List["Address"]] = relationship( 23 "Address", back_populates="user" 24 ) 25 26 @property 27 def some_property(self) -> List[Optional[int]]: 28 return [i.id for i in self.addresses] 29 30 31class Address(Base): 32 __tablename__ = "address" 33 34 id = Column(Integer, primary_key=True) 35 user_id: int = Column(ForeignKey("user.id")) 36 37 user: "User" = relationship("User", back_populates="addresses") 38 39 @property 40 def some_other_property(self) -> Optional[str]: 41 return self.user.name 42 43 44# it's in the constructor, correct type 45u1 = User(addresses=[Address()]) 46 47# knows it's an iterable 48[x for x in u1.addresses] 49 50# knows it's Mapped 51stmt = select(User).where(User.addresses.any(id=5)) 52