Python 同一两个模型之间的一对多和一对一关系

Python 同一两个模型之间的一对多和一对一关系,python,python-3.x,sqlalchemy,relationship,Python,Python 3.x,Sqlalchemy,Relationship,我有一个玩家职业,每个玩家拥有X个角色实例: class Player(Model): characters = relationship('Character', back_populates='owner') class Character(Model): owner = relationship('Player', back_populates='characters') owner_id = Column('player_id', Integer, Foreig

我有一个
玩家
职业,每个玩家拥有X个
角色
实例:

class Player(Model):
    characters = relationship('Character', back_populates='owner')

class Character(Model):
    owner = relationship('Player', back_populates='characters')
    owner_id = Column('player_id', Integer, ForeignKey('player.id'))
但除此之外,每个人都有一个他目前控制的角色。这意味着每个玩家都有多个自己的角色,但其中只有一个是活动的,所以我需要能够保持在一个单独的值左右


如何在现有的一对多关系旁边添加一对一关系?

如果在玩家表中再添加一列,使玩家保持当前角色,该怎么办。您可以在需要时进行更改:

class Player(Model):
    characters = relationship('Character', back_populates='owner')
    current_character = Column('character_id', Integer, ForeignKey('character.id'))
    def refresh(self, id):
        c_id = session.query(Character).filter(character.id == id)
        if c_id:
            self.current_character = c_id.id
            session.add(self)

若你们在玩家表中增加一列,让玩家保持当前角色,会怎么样。您可以在需要时进行更改:

class Player(Model):
    characters = relationship('Character', back_populates='owner')
    current_character = Column('character_id', Integer, ForeignKey('character.id'))
    def refresh(self, id):
        c_id = session.query(Character).filter(character.id == id)
        if c_id:
            self.current_character = c_id.id
            session.add(self)

显然,SQLAlchemy为
关系()
提供了一个
uselist=False
选项,我只是使用了它

class Player(Model):
    character = relationship('Character', uselist=False, back_populates='owner')
    characters = relationship('Character', back_populates='owner')

class Character(Model):
    owner = relationship('Player', back_populates='characters')
    owner_id = Column('player_id', Integer, ForeignKey('player.id'))

显然,SQLAlchemy为
关系()
提供了一个
uselist=False
选项,我只是使用了它

class Player(Model):
    character = relationship('Character', uselist=False, back_populates='owner')
    characters = relationship('Character', back_populates='owner')

class Character(Model):
    owner = relationship('Player', back_populates='characters')
    owner_id = Column('player_id', Integer, ForeignKey('player.id'))

再添加一个布尔列名作为活动列名,其值为True或False。并使播放器和活动id与字符唯一。再添加一个布尔列名作为活动,其值为True或False。并使玩家和活动id与角色保持唯一性。