Вложенный relationship sqlalchemy с агрегатной функцией

Всем привет, есть две таблицы в базе, одна с комментариями пользователей, другая с лайками.

class Comments(Base):
    __tablename__ = 'comments'

    id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
    user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id"))
    item_id: Mapped[UUID] = mapped_column(nullable=True)
    parent_comment_id: Mapped[UUID] = mapped_column(ForeignKey("comments.id", ondelete="RESTRICT"), nullable=True)
    text: Mapped[str]
    like_count: Mapped[int] = mapped_column(default=0)
    deleted: Mapped[bool]
    created_at: Mapped[datetime.datetime] = mapped_column(server_default=text("TIMEZONE('utc', now())"))
    author_info: Mapped["Users"] = relationship("Users", primaryjoin="Users.id==Comments.user_id")

    child_comment: Mapped[list["Comments"]] = relationship(
        "Comments", 
        primaryjoin="Comments.id == Comments.parent_comment_id",
        )
    like_log: Mapped[list["LikeLog"]] = relationship("LikeLog",         
                                                    primaryjoin="Comments.id == LikeLog.item_id",
                                                    foreign_keys=[id],
)
class LikeLog(Base):
    __tablename__ = 'like_log'

    id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
    user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id"))
    type_id: Mapped[UUID] = mapped_column(ForeignKey("like_types.id"))
    item_id: Mapped[UUID]
    value: Mapped[bool]
    created_at: Mapped[datetime.datetime] = mapped_column(server_default=text("TIMEZONE('utc', now())"))
    updated_at: Mapped[datetime.datetime] = mapped_column(
        server_default=text("TIMEZONE('utc', now())"),
        onupdate=datetime.datetime.utcnow,
    )

Логика у меня такая, вывести комментарии и ответы на них, а так же проверить, поставил ли пользователь лайк комментарию. Но мой запрос выводит все комментарии, а проверка на наличия лайка вообще не работает.

Вот мой запрос:

        query = (
            select(self.model, 
                   func.sum(case((and_(LikeLog.user_id == 'b7f75c55-69ec-48f1-bdfe-c053eaf58f30', LikeLog.item_id == '56633330-1aa2-4e9e-a662-8cc26d386f22'), 1), else_=0)).label('hasAuthorLike')
                   )
            # .options(contains_eager(self.model.child_comment))
            # .join(LikeLog, onclause=LikeLog.item_id == self.model.id, isouter=True)

            .options(selectinload(self.model.child_comment).selectinload(self.model.author_info))
            .options(selectinload(self.model.author_info))
            .options(selectinload(self.model.like_log))
            .filter_by(**filter_by)
            .group_by(self.model.id)
        )
        result = await self.session.execute(query)
        self.session.expunge_all()

        try:
            result = result.all()
            return result
        except:
            return False

Вместо self.model везде подставляется Comments соответственно. Буду рад любому совету, а то уже голову изломал как так вывести данные. Если получиться вывести только родительские комментарии вообще супер будет


Ответы (0 шт):