"""
                  
                  
                      Модель пользователя
                  
                  
                      """
                  
                  
                  
                  
                  
                      __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)) Может кто-то сталкивался с таким? Заранее спасибо за ответ. Ты читал официальный туториал алхимии?
Все сталкивались. В этом разделе написано что делать.
Обсуждают сегодня