FASTAPI如何将帖子与点赞数据合并为单个对象返回
解决FastAPI中帖子与点赞数合并返回的问题
要实现将点赞数直接嵌入帖子对象的返回结构,只需调整Pydantic响应模型和查询结果的处理逻辑:
1. 修改Pydantic响应模型
把原来嵌套的PostResponse改成直接继承BasePostResponse并添加likes字段,让模型结构和期望的返回格式完全匹配:
from pydantic import BaseModel, EmailStr from datetime import datetime class UserBase(BaseModel): id: int email: EmailStr class Config: orm_mode = True class PostBase(BaseModel): title: str description: str class BasePostResponse(PostBase): id: int created_at: datetime user: UserBase class Config: orm_mode = True # 修改后的响应模型:直接继承帖子基础字段,新增likes class PostResponse(BasePostResponse): likes: int class Config: orm_mode = True
2. 调整路由中的查询结果处理
SQLAlchemy查询返回的是元组列表(每个元组是(SocialPost实例, 点赞数)),需要将这些元组转换为包含帖子所有字段和点赞数的统一结构:
from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from sqlalchemy import func from typing import List, Optional import socialMedia # 导入你的模型模块 import models # 导入SQLAlchemy模型 from database import get_db # 导入你的数据库会话依赖 @router.get("/all", response_model=List[socialMedia.PostResponse]) def get_posts(db: Session = Depends(get_db), per_page: int = 50, page: int = 1, search: Optional[str] = ""): # 原查询逻辑保持不变 posts = db.query(models.SocialPost, func.count(models.SocialLikes.post_id).label('likes')).join( models.SocialLikes, models.SocialLikes.post_id == models.SocialPost.id, isouter=True ).group_by(models.SocialPost.id).filter( models.SocialPost.title.contains(search) ).limit(per_page).offset(per_page * (page - 1)).all() # 将元组转换为合并后的结构 return [ {**socialMedia.BasePostResponse.from_orm(post).dict(), "likes": likes} for post, likes in posts ]
修改后的返回结果
调整后接口会返回你期望的结构:
[ { "title": "First post", "description": "First Desc", "id": 2, "created_at": "2022-09-19T21:47:45.660685+02:00", "user": { "id": 1, "email": "admin@test.com" }, "likes": 0 }, ... ]
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

