【问题标题】:One-to-many and one-to-one relationships between the same two models相同的两个模型之间的一对多和一对一关系
【发布时间】:2017-06-10 12:16:10
【问题描述】:

我有一个Player 类,每个玩家拥有X 个Character 实例:

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'))

但除此之外,每个人都有一个他当前控制的角色。这意味着每个玩家都有多个他们拥有的角色,但只有一个是活跃的,所以我需要能够将它保持在一个单独的值左右。

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

【问题讨论】:

  • 添加一个布尔列名作为活动的,其值为 True 或 False。并让玩家和活动 ID 在角色中独一无二。

标签: python python-3.x sqlalchemy relationship


【解决方案1】:

如果你在玩家表中再添加一列,以保持玩家当前角色。您可以在需要时更改它:

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)

【讨论】:

    【解决方案2】:

    显然 SQLAlchemy 有一个 uselist=False 选项用于 relationship(),我刚刚使用它...

    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'))
    

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2013-08-19
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多