app*_*ver 5 python sqlalchemy class
这是我在 sqlalchemy 中使用的一些非常简单的代码,但我在这里缺少一些关于类如何工作的基本信息。
class Game(Base):
__tablename__ = "games"
id = Column(Integer, primary_key=True)
a_name = Column(String)
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
print 'hi'
self.away_dictionary = {'name': self.a_name}
@hybrid_property
def stuff(self):
return self.away_dictionary
Run Code Online (Sandbox Code Playgroud)
以下查询有效:
session.query(Game).first().a_name
Run Code Online (Sandbox Code Playgroud)
但以下查询返回错误:
session.query(Game).first().stuff
'Game' object has no attribute 'away_dictionary'
Run Code Online (Sandbox Code Playgroud)
我还有一个更基本的问题,当我查询 Game 类时,它不会打印出“hi”。那么有人可以解释为什么每次使用 Game 实例时都不会打印出“嗨”吗?第二个问题是如何为此类的每个实例构建和访问我想要的 away_dictionary ?
感谢您的评论。是我一个人的问题还是 sqlalchemy 有点令人困惑?
\n\n无论如何,正如人们在上面指出的那样,__init__当您进行查询时,该方法显然不会被调用。
\n\n\n\n
__init__从数据库行重新创建对象时,SQLAlchemy ORM 不会调用。ORM\xe2\x80\x99s 过程有点类似于 Python\n 标准库\xe2\x80\x99s pickle 模块,调用低级__new__\n 方法,然后直接在实例上悄悄恢复属性\n 而不是调用__init__.
解决这个问题的方法是添加以下代码:
\n\nfrom sqlalchemy.orm import reconstructor\n@reconstructor\nawesome_true_init(self):\n self.away_dictionary = {'hi': 'i work!!'}\nRun Code Online (Sandbox Code Playgroud)\n\n该函数将像真实函数一样运行__init__,并在您创建对象时被调用!
| 归档时间: |
|
| 查看次数: |
10639 次 |
| 最近记录: |