2016-08-15 53 views
0

不SQLAlchemy的支持是这样的:财产行为(getter和setter)为一列,而不是通常属性的行为

class Character(Base): 
    __tablename__ = 'character' 
    id = Column(Integer, primary_key=True) 
    level = Column(Integer) 

    @ColumnProperty(Integer) 
    def xp(self): 
     return self._xp 

    @xp.setter 
    def xp(self, value): 
     self._xp = value 
     while self._xp >= self.xp_to_level_up(): 
      self.level += 1 
      self._xp -= 100 

    def __init__(self, level=0, xp=0): 
     self.level = level 
     self._xp = xp 

idlevelxp会被存储到数据库中。所以基本上是一个Column,而不是属性属性。

回答

2

只需添加一个_xp列定义,映射到表中的xp列,并使用常用的@property对象来实现您的二传手逻辑:

class Character(Base): 
    __tablename__ = 'character' 
    id = Column(Integer, primary_key=True) 
    level = Column(Integer) 
    _xp = Column('xp', Integer) 

    def __init__(self, level=0, xp=0): 
     self.level = level 
     self._xp = xp 

    @property 
    def xp(self): 
     return self._xp 

    @xp.setter 
    def xp(self, value): 
     self._xp = value 
     while self._xp >= self.xp_to_level_up(): 
      self.level += 1 
      self._xp -= 100 

Naming Naming Columns Distinctly from Attribute Names

以上门店实例上的_xp属性作为characterxp,但你的代码使用Character.xp属性来读取和间接写入的_xp值。

+0

谢谢!仍然希望有一天能够看到类似财产的专栏^^ –

+0

但是,这样的财产不会在现有选项上添加任何内容。 –

+0

当然不是在这个特定的情况下,但有时它会允许一个人只有*属性列,没有别的。 –