2017-01-25 6 views
0

у меня есть 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')) 

Но на вершине этого, каждый имеет один символ, который он сейчас контролирует. Это означает, что каждый игрок имеет несколько персонажей, которыми владеет, но только один из них активен, поэтому мне нужно иметь возможность сохранить это в отдельном значении или около того.

Как я могу добавить отношение «один к одному» рядом с существующими отношениями «один ко многим»?

+0

Добавить еще одно логическое имя столбца в качестве активного, который будет имеют значение True или False. И сделайте игрока и активный идентификатор уникальным с характером. – Roshan

ответ

0

Видимо 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')) 
0

Что делать, если вы добавили еще один столбец в таблицу Player, чтобы сохранить текущий символ игроков. Вы можете изменить его, когда вам нужно:

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) 
Смежные вопросы