Вложенный 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 соответственно. Буду рад любому совету, а то уже голову изломал как так вывести данные. Если получиться вывести только родительские комментарии вообще супер будет