Вопрос по FastAPI, Pydantic и SQLAlchemy
Имеется модель статьи:
class Article(Base):
title = Column(String(length=255), nullable=False)
# etc
Также есть модель для хранения реакций на статью:
class ArticleReaction(Base):
class Type(str, enum.Enum):
LIKE = 'LIKE'
DISLIKE = 'DISLIKE'
id = Column(Integer, primary_key=True)
article_id = Column(Integer, ForeignKey('article.id'), nullable=False)
user_id = Column(Integer, ForeignKey('user.id'), nullable=False)
type = Column(Enum(Type), nullable=False)
Определил endpoint для лайкания/дизлайкания конкретной статьи:
@router.post('/articles/{slug}/reactions/', response_model=schemas.ArticleReaction)
def react(
*,
db: Session = Depends(dependencies.get_db),
user: models.User = Depends(oauth2.get_user),
slug: str,
schema: schemas.ArticleReactionUpdate,
):
article: models.Article = crud.article.retrieve(db, slug=slug)
if not article:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
reaction = db.query(ArticleReaction).(article_id=article.id, user_id=user.id)
# если уже стоит реакция, то удаляем ее
if reaction is not None:
db.delete(reaction)
db.commit()
# если стоявшая реакция была как прилетевшая, то ничего дальше не делаем
if reaction.type == type:
return Response(status_code=status.HTTP_200_OK)
# если же прислали новую реакцию, создаем запись с новым типом реакции
reaction = ArticleReaction(
article_id=article.id,
user_id=user.id,
type=schema.type,
)
db.add(reaction)
db.commit()
db.refresh(reaction)
return reaction
Pydantic модели для ArticleReaction:
class ArticleReactionBase(BaseModel):
article_id: int
user_id: int
type: ArticleReaction.Type
class ArticleReactionCreate(ArticleReactionBase):
pass
class ArticleReactionUpdate(BaseModel):
type: ArticleReaction.Type
class ArticleReaction(ArticleReactionBase):
class Config:
orm_mode = True
Вопрос:
Когда на фронте я вывожу список карточек статьей, я хочу подсветить текущую реакцию пользователя на каждую статью.
Как в ленте в ВК мы видим, лайкнули мы пост или нет.
Как мне это сделать? Как узнать текущую реакцию пользователя на каждую статью?