SQLAlchemy“可选”外键/ZerotoOne关系

2024-10-01 19:32:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从原始SQL切换到SQLAlchemy,我正在努力建模用户和团队之间的关系。 在这种情况下,团队有一个用户列表,用户可以是零个或一个团队

在用户表中使用“可选外键”之类的方法,引用team.id可能会起作用,但它必须可以为null,这不是最好的方式

使用原始SQL时,我通常创建第三个表TeamUser(user\u id,team\u id),其中user\u id作为主键

在SQLAlchemy中完全可以通过创建一个表来复制这一点,但是使用这些对象需要编写的python代码变得不那么清晰

例如:

将用户添加到团队:

db.session.add(TeamUser(user_id=user.id, team_id=team.id)) 
#instead of
team.users.append(user)

访问用户的团队:

user.team.team (user.team is now the couple (user_id, team_id))

获取作为用户对象的用户列表:

map(lambda team_user: team_user.user, team.users)  
#instead of
team.users

所以我的问题是:在使用SQLAlchemy对象时,有没有一种方法既可以对这种用户/团队情况建模,又可以保持简单的语法

我已经研究了主连接,但它似乎没有回答这个问题。(但也许我错了)


Tags: 对象方法用户id列表sqlsqlalchemy情况
1条回答
网友
1楼 · 发布于 2024-10-01 19:32:23

如果您确实想使用联接表,请查看association_proxy

对于一对多关系,外键更简单。玩家(用户可能是一个保留字)引用了一个团队:

class Player(Base):
    __tablename__ = 'player'
    id = Column(Integer, primary_key=True)
    team_id = Column(Integer, ForeignKey('team.id'))
    team = relationship('Team')

一支球队有一份球员名单:

class Team(Base):
    __tablename__ = 'team'
    id = Column(Integer, primary_key=True)
    players = relationship('Player', back_populates='team')

然后你可以通过

team.players.append(player) # Player() object

获得一个球员的球队(可能是None

team: Team = player.team

将玩家列表作为玩家对象获取

team.players

相关问题 更多 >

    热门问题