You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:25:33