I have the following project hierarchy
src/
schemas/
foo.py
bar.py
models/
foo.py
bar.py
models has definitions for SQLAlchemy classes
#foo.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.models.bar import Bar
class Foo(Base):
x: Mapped[int] = mapped_column(Integer)
y: Mapped["Bar"] = relationship("Bar", back_populates="b")
#bar.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.models.foo import Foo
class Bar(Base):
a: Mapped[int] = mapped_column(Integer)
b: Mapped["Foo"] = relationship("Foo", back_populates="y")
schemas has definations for Pydantic classes
#foo.py
from pydantic import BaseModel, Field, field_validator
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.schemas.bar import Bar
class Foo(BaseModel):
x: int = Field(...)
y: "Bar" = Field(...)
# bar.py
from pydantic import BaseModel, Field, field_validator
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.schemas.foo import Foo
class Bar(BaseModel):
a: int = Field(...)
b: "Foo" = Field(...)
The issue I am facing is in validating relationship field.
#foo.py
from pydantic import BaseModel, Field, field_validator
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.schemas.bar import Bar
class Foo(BaseModel):
x: int = Field(...)
y: "Bar" = Field(...)
@field_validator("y", mode="before")
@classmethod
def validate_relationship(cls, v: Any):
return Bar.model_validate(v)
# bar.py
from pydantic import BaseModel, Field, field_validator
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from src.schemas.foo import Foo
class Bar(BaseModel):
a: int = Field(...)
b: "Foo" = Field(...)
@field_validator("b", mode="before")
@classmethod
def validate_relationship(cls, v: Any):
return Bar.model_validate(v)
I get the NameError ‘Bar’ when validating Foo and NameError ‘Foo’ when validating ‘Bar
How do I resolve this error without running into circular imports
I have defined TYPE_CHECKING import guards, importing annotations from futures package lazy loading of modules.
Sidharth Sharma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.