SQLAlchemy __init__没有运行

dis*_*dng 10 python sqlalchemy

我有以下代码:

session = scoped_session(sessionmaker(autocommit=False, autoflush=True, bind=engine))

Base = declarative_base()
Base.query = session.query_property()

class CommonBase(object):
  created_at = Column(DateTime, default=datetime.datetime.now)
  updated_at = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)

class Look(Base, CommonBase):
  __tablename__ = "looks"
  id = Column(Integer, primary_key=True)

  def __init__(self):
    print "__init__ is run"
    Base.__init__(self)
    self.feedback = None

  def set_feedback(self, feedback):
    """Status can either be 1 for liked, 0 no response, or -1 disliked.
    """
    assert feedback in [1, 0, -1]
    self.feedback = feedback

  def get_feedback(self):
    return self.feedback
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Traceback (most recent call last):
  File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Volumes/Data2/Dropbox/projects/Giordano/venv/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/backend.py", line 94, in wrapped
    ret = f(*args, **kwargs)
  File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/backend.py", line 81, in decorated
    return f(*args, **kwargs)
  File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/backend.py", line 187, in next
    json_ret = ge.encode(results)     # automatically pulls the tags
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/__init__.py", line 54, in default
    jsonable = self.convert_to_jsonable(obj)
  File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/__init__.py", line 40, in convert_to_jsonable
    image_url=obj.image_url, feedback=obj.get_feedback())
  File "/Volumes/Data2/Dropbox/projects/Giordano/src/giordano/models.py", line 100, in get_feedback
    return self.feedback
AttributeError: 'Look' object has no attribute 'feedback'
Run Code Online (Sandbox Code Playgroud)

在我看来,我的__init__方法没有运行,因为我在日志中看不到任何打印语句.

有人可以解释为什么我__init__没有跑,我能为此做些什么?

Mar*_*eth 30

查看有关重建SQLAlchemy文档:

__init__从数据库行重新创建对象时,SQLAlchemy ORM不会调用.ORM的过程有点类似于Python标准库的pickle模块,调用低级__new__ 方法然后直接在实例上静默地恢复属性而不是调用__init__.

如果您需要在数据库加载的实例上进行一些设置,然后才能使用它们,您可以使用@reconstructor装饰器将方法标记为与ORM对应的方法__init__.每次加载或重构一个实例时,SQLAlchemy都会调用此方法而不带参数.这对于重新创建通常在__init__以下内容中指定的瞬态属性很有用:

from sqlalchemy import orm

class MyMappedClass(object):
    def __init__(self, data):
        self.data = data
        # we need stuff on all instances, but not in the database.
        self.stuff = []

    @orm.reconstructor
    def init_on_load(self):
        self.stuff = []
Run Code Online (Sandbox Code Playgroud)

当执行obj = MyMappedClass()时,Python __init__ 正常调用该方法,并且需要data参数.在Query操作期间加载实例时,如在查询(MyMappedClass)init_on_load中调用.one() .