Как я могу проверить отношения SQLAlchemy с помощью Pydantic model_validate, избегая при этом циклического импорта?Python

Программы на Python
Anonymous
Как я могу проверить отношения SQLAlchemy с помощью Pydantic model_validate, избегая при этом циклического импорта?

Сообщение Anonymous »

У меня следующая иерархия проектов

Код: Выделить всё

src/
schemas/
foo.py
bar.py
models/
foo.py
bar.py
модели содержат определения классов SQLAlchemy

Код: Выделить всё

#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")
схемы содержат определения для классов Pydantic

Код: Выделить всё

#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(...)
Проблема, с которой я столкнулся, заключается в проверке поля отношений.

Код: Выделить всё

#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)
Я получаю ошибку NameError «Bar» при проверке Foo и NameError «Foo» при проверке «Bar».
Как устранить эту ошибку, не сталкиваясь с циклический импорт
Я определил средства защиты импорта TYPE_CHECKING, импортируя аннотации из пакета futures, отложенную загрузку модулей.

Подробнее здесь: https://stackoverflow.com/questions/784 ... date-while

Вернуться в «Python»