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

如何通过SQLModel Relationship获取Post的点赞数而非点赞列表?

在SQLModel中为Post添加高效的点赞数字段

你不能直接用Relationship实现这个需求——Relationship的作用是关联实体对象集合,而点赞数是聚合计算的标量值,应该用SQLAlchemy的column_property来实现(SQLModel完全支持该特性)。

具体实现步骤:

  1. 导入所需工具:
from sqlalchemy import func, column_property
from sqlmodel import SQLModel, Field, Relationship
from datetime import datetime
  1. 调整Post及关联类的定义:
# 提前声明PostUpvote避免循环导入
class PostUpvote(SQLModel, table=True):
    post_id: str = Field(foreign_key="post.id", primary_key=True)
    user_id: str = Field(foreign_key="amp_users.id", primary_key=True)
    post: "Post" = Relationship(back_populates="upvotes")
    user: "User" = Relationship(back_populates="upvotes")

class Post(PostBase, table=True):
    creator_id: str = Field(foreign_key="amp_users.id")
    id: str = PkIdField()
    created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
    creator: User = Relationship(back_populates="posts")
    upvotes: List["PostUpvote"] = Relationship(back_populates="post")
    
    # 通过聚合查询定义点赞数字段
    upvote_count: int = column_property(
        func.count(PostUpvote.id).where(PostUpvote.post_id == id).correlate_except(PostUpvote)
    )

关键说明:

  • column_property会将聚合查询直接整合到Post的SELECT语句中,查询Post时自动计算并返回点赞数,无需加载所有upvotes对象,大幅降低数据库查询开销和数据传输量。
  • correlate_except(PostUpvote)确保子查询仅关联当前Post表,避免产生不必要的笛卡尔积。
  • 该实现兼容SQLModel的同步/异步引擎,底层SQLAlchemy会处理好聚合查询的执行逻辑。

查询示例:

查询Post时,upvote_count会自动包含在结果中:

from sqlmodel import select, Session

# 同步查询
with Session(engine) as session:
    posts = session.exec(select(Post)).all()
    for post in posts:
        print(f"Post {post.id} 点赞数: {post.upvote_count}")

内容的提问来源于stack exchange,提问作者rmehlinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:05:32