"""
Модель пользователя
"""
__tablename__ = "users"
id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
username: Mapped[str] = mapped_column(unique=True)
email: Mapped[str] = mapped_column(unique=True)
password: Mapped[str]
created_date: Mapped[datetime.datetime] = mapped_column(
default=datetime.datetime.utcnow
)
posts: Mapped[list["Post"]] = relationship(
back_populates="user",
lazy="selectin",
)
@property
def count_posts(self) -> int:
return len(self.posts)
Post:
class Post(Base):
"""
Модель поста
"""
__tablename__ = "posts"
id: Mapped[int] = mapped_column(primary_key=True)
owner_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("users.id", ondelete="CASCADE")
)
title: Mapped[str]
text: Mapped[str]
updated_date: Mapped[datetime.datetime | None] = mapped_column(
onupdate=datetime.datetime.utcnow()
)
created_date: Mapped[datetime.datetime] = mapped_column(
default=datetime.datetime.utcnow()
)
user: Mapped["User"] = relationship(
back_populates="posts",
lazy="joined",
)
Получаю все посты следующей функцией:
async def get_posts(
session: AsyncSession,
) -> list[Post | None]:
"""
Получение всех постов из БД
"""
async with session.begin():
query = select(Post)
posts = await session.scalars(query)
return posts
Далее при сериализации через pydantic получаю следующую ошибку:
pydantic_core._pydantic_core.ValidationError: 1 validation error for GetPost
user.count_posts
Error extracting attribute: MissingGreenlet: greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place? (Background on this error at: https://sqlalche.me/e/20/xd2s) [type=get_attribute_error, input_value=<db.models.User object at 0x7f937c640370>, input_type=User]
For further information visit https://errors.pydantic.dev/2.1/v/get_attribute_error
Сам сериализатор:
class GetPost(BaseModel):
"""
Схема получение поста
"""
id: int
title: str
text: str
updated_date: datetime.datetime | None
created_date: datetime.datetime
user: GetUser
class Config:
from_attributes = True
Уже несколько часов бьюсь с проблемой. Пока что нашел единственное решение в изменении функции get_posts, а именно в изменении query:
query = select(Post).options(joinedload(Post.user).selectinload(User.posts))
Может кто-то сталкивался с таким? Заранее спасибо за ответ.
Убирай порятнку на pastebin.com
> Уже несколько часов бьюсь с проблемой. Пока что нашел единственное решение в изменении функции get_posts, а именно в изменении query: query = select(Post).options(joinedload(Post.user).selectinload(User.posts)) Может кто-то сталкивался с таким? Заранее спасибо за ответ. Ты читал официальный туториал алхимии?
Все сталкивались. В этом разделе написано что делать.
Обсуждают сегодня