"many" 属于不同子类的多态一对多关系
Polymorphic one-to-many relationship where "many" are of different subclasses
我有一个 Player
class 并且每个玩家拥有 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'))
level = Column(Integer, default=0)
但现在我想用 __abstract__
使 Character
成为基础 class,并且只将其子class 实例记录到数据库中:
class Character(Model):
__abstract__ = True
owner = relationship('Player', back_populates='characters')
owner_id = Column('player_id', Integer, ForeignKey('player.id'))
level = Column(Integer, default=0)
def use_special_ability(self, target):
raise NotImplementedError
class Warrior(Character):
def use_special_ability(self, target):
bla_bla(target)
class Mage(Character):
def use_special_ability(self, target):
foo(self.level, bar=True)
是否只有一个 character
table 或所有字符子 class 都有自己的 table 对我来说并不重要(尽管前者略微优先),只要 Python 方有效 "flawlessly",即每个玩家都有 一个 角色列表,无论其类型如何。
我该如何改变这种关系,使其适用于多个像这样的子class?
这是一个例子:
class Player(Model):
__tablename__ = "player"
characters = relationship('Character', back_populates='owner')
class Character(Model):
__tablename__ = "character"
id = Column(Integer, primary_key=True)
type = Column(Enum("warrior", "mage")), nullable=False)
owner = relationship('Player', back_populates='characters')
owner_id = Column('player_id', Integer, ForeignKey('player.id'))
__mapper_args__ = {
"polymorphic_on": type,
}
...
class Warrior(Character):
__tablename__ = None
__mapper_args__ = {
"polymorphic_identity": "warrior",
}
...
class Mage(Character):
__tablename__ = None
__mapper_args__ = {
"polymorphic_identity": "mage",
}
...
我有一个 Player
class 并且每个玩家拥有 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'))
level = Column(Integer, default=0)
但现在我想用 __abstract__
使 Character
成为基础 class,并且只将其子class 实例记录到数据库中:
class Character(Model):
__abstract__ = True
owner = relationship('Player', back_populates='characters')
owner_id = Column('player_id', Integer, ForeignKey('player.id'))
level = Column(Integer, default=0)
def use_special_ability(self, target):
raise NotImplementedError
class Warrior(Character):
def use_special_ability(self, target):
bla_bla(target)
class Mage(Character):
def use_special_ability(self, target):
foo(self.level, bar=True)
是否只有一个 character
table 或所有字符子 class 都有自己的 table 对我来说并不重要(尽管前者略微优先),只要 Python 方有效 "flawlessly",即每个玩家都有 一个 角色列表,无论其类型如何。
我该如何改变这种关系,使其适用于多个像这样的子class?
这是一个例子:
class Player(Model):
__tablename__ = "player"
characters = relationship('Character', back_populates='owner')
class Character(Model):
__tablename__ = "character"
id = Column(Integer, primary_key=True)
type = Column(Enum("warrior", "mage")), nullable=False)
owner = relationship('Player', back_populates='characters')
owner_id = Column('player_id', Integer, ForeignKey('player.id'))
__mapper_args__ = {
"polymorphic_on": type,
}
...
class Warrior(Character):
__tablename__ = None
__mapper_args__ = {
"polymorphic_identity": "warrior",
}
...
class Mage(Character):
__tablename__ = None
__mapper_args__ = {
"polymorphic_identity": "mage",
}
...