2016-08-15 57 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

當然不是在這個特定的情況下,但有時它會允許一個人只有*屬性列,沒有別的。 –

相關問題