如何使用SQLAlchemy获取单个用户的所有评分?
获取用户对所有建议的评分记录
你的需求完全可行,但当前的数据模型无法实现——因为Suggestion表中的rating字段是全局单一值,无法区分不同用户对同一条建议的评分。要实现多用户对多建议的独立评分,需要添加用户-建议评分关联表,用来存储每个用户对每条建议的具体评分。
修正数据模型
以下是调整后的SQLAlchemy模型代码:
from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, Session from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() # 中间关联表:存储用户-建议-评分的对应关系 class UserSuggestionRating(Base): __tablename__ = "user_suggestion_ratings" user_id = Column(Integer, ForeignKey("users.user_id"), primary_key=True) s_id = Column(Integer, ForeignKey("suggestions.s_id"), primary_key=True) rating = Column(Integer, nullable=False) # 关联到用户和建议表 user = relationship("User", back_populates="ratings") suggestion = relationship("Suggestion", back_populates="ratings") class Suggestion(Base): __tablename__ = "suggestions" s_id = Column("s_id", Integer, primary_key=True, autoincrement=True) content = Column("content", String, nullable=False) # 关联到评分记录 ratings = relationship("UserSuggestionRating", back_populates="suggestion") def __repr__(self): return f"Suggestion #{self.s_id}: {self.content}" class User(Base): __tablename__ = "users" user_id = Column("user_id", Integer, primary_key=True) # 关联到评分记录 ratings = relationship("UserSuggestionRating", back_populates="user") def __init__(self, user_id): self.user_id = user_id def __repr__(self): return f"User #{self.user_id}"
查询指定用户的所有评分记录
假设你要查询用户#1的所有评分,可以通过以下代码实现:
# 创建会话 session = Session() # 查询用户#1的所有评分,关联建议内容 user_ratings = session.query( Suggestion.content, UserSuggestionRating.rating ).join(UserSuggestionRating).filter( UserSuggestionRating.user_id == 1 ).all() # 输出结果 for content, rating in user_ratings: print(f"建议:{content},评分:{rating}") # 关闭会话 session.close()
这段代码会返回类似如下结果:
建议:Improve the interface,评分:10
建议:Fix bugs,评分:5
补充说明
- 中间表
user_suggestion_ratings的主键由user_id和s_id联合组成,确保同一个用户不会对同一条建议重复评分(如果需要允许修改评分,可去掉联合主键,改用自增主键,或保留联合主键并更新评分值)。 - 如果需要获取所有建议(包括该用户未评分的),可以使用左连接,未评分的建议会显示
rating为None,调整查询语句如下:
user_ratings = session.query( Suggestion.content, UserSuggestionRating.rating ).outerjoin( UserSuggestionRating, (Suggestion.s_id == UserSuggestionRating.s_id) & (UserSuggestionRating.user_id == 1) ).all()
内容的提问来源于stack exchange,提问作者Youtipie
相关产品推荐
相关产品推荐

