作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SQLAlchemy 是否支持这样的东西:
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
id
、level
和 xp
将存储到数据库中。所以基本上是一个Column
,但不是属性而是属性。
最佳答案
只需添加一个 _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 Columns Distinctly from Attribute Names .
上面将实例上的 _xp
属性存储为 character
表中的 xp
,但您的代码使用 Character. xp
属性间接读取和写入 _xp
的值。
您还可以使用@hybrid_property
;这就像上面使用的 property
一样,但也允许您在查询过滤器中使用 Character.xp
:
from sqlalchemy.ext.hybrid import hybrid_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
@hybrid_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
现在您可以使用 session.query(Character).filter(Character.xp > 42)
和其他此类过滤查询,而不必使用 Character._xp
。
如果您想对角色进行批量更新,您可能必须 include a update_expression
implementation这将告诉 SQLAlchemy 如何为 UPDATE
生成 SET
表达式;除了调整 XP 之外,也许还可以使用 CASE
表达式来处理更新级别。
关于python - 列的属性行为(getter 和 setter),而不是正常的属性行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38955334/
我是一名优秀的程序员,十分优秀!