首页 > 解决方案 > Flask SQLAlchemy:具有多个父级的子表?

问题描述

我是 flask_sqlalchemy 的新手,虽然我了解一对多和多对多关系的工作原理,但我很难理解如何将它们应用于我的特定数据类型。我有以下三个表:TeamStat、PlayerStat 和 Stat,它们大致描述如下

class PlayerStat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False, default=datetime.datetime)
    player_id = db.Column(db.Integer, db.ForeignKey('player.player_id'), nullable=False)

class TeamStat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False, default=datetime.datetime)
    team_id = db.Column(db.Integer, db.ForeignKey('team.team_id'), nullable=False)


class Stat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.String(80), nullable=False)

由于 Stat 是一种通用表类型,我希望 PlayerStat 表(用于单个球员的统计数据)和 TeamStat 表(作为团队中所有球员的统计数据的总和)都使用它。有人可以帮助我了解如何以这种方式将一个子表引用到多个父表吗?

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


使用关联表将您的统计表连接到您的球员和球队表。这个例子非常接近你已经在做的,除了date列被移动到统计记录表,我已经用未映射的表替换了你的PlayerStat和对象。TeamStat

我假设您有两个 ORM 类,Player并且Team(不是 Flask-SQLAlchemy 抱歉,但概念保持不变):

plr_stat_assc = Table('plr_stat_assc', Base.metadata,
    Column('player_id', Integer, ForeignKey('player.id')),
    Column('stat_id', Integer, ForeignKey('stat.id'))
)

team_stat_assc = Table('team_stat_assc', Base.metadata,
    Column('team_id', Integer, ForeignKey('team.id')),
    Column('stat_id', Integer, ForeignKey('stat.id'))
)

class Player(Base):
    __tablename__ = 'player'
    id = Column(Integer, primary_key=True)
    stats = relationship("Stat", secondary=plr_stat_assc)

class Team(Base):
    __tablename__ = 'team'
    id = Column(Integer, primary_key=True)
    stats = relationship("Stat", secondary=team_stat_assc)

class Stat(Base):
    __tablename__ = 'stat'
    id = Column(Integer, primary_key=True)
    date = Column(DateTime, nullable=False, default=datetime.datetime)
    value = Column(String(80), nullable=False)

推荐阅读