Как я могу проверить отношения 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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