11

次のコードがあります。

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

そして、次のエラーが表示されます。

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'

ログに印刷ステートメントが表示されないため、__init__メソッドが実行されていないようです。

誰かが実行されない理由__init__と、これに対して何ができるかを説明できますか?

4

1 に答える 1

30

再構築に関する SQLAlchemy のドキュメントを確認してください。

__init__データベース行からオブジェクトを再作成する場合、SQLAlchemy ORM は呼び出されません。ORM のプロセスは、Python 標準ライブラリの pickle モジュールに似ており、低レベルの__new__ メソッドを呼び出し、 __init__.

データベースにロードされたインスタンスを使用する前にセットアップを行う必要がある場合は、 @reconstructor デコレーターを使用して、メソッドを に対応する ORM としてタグ付けできます__init__。SQLAlchemy は、インスタンスの 1 つをロードまたは再構築するたびに、引数なしでこのメソッドを呼び出します。これは、通常は で割り当てられる一時的なプロパティを再作成するのに役立ちます__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 = []

obj = MyMappedClass() が実行されると、Python は__init__ 通常どおりメソッドを呼び出し、data 引数が必要になります。query(MyMappedClass).one() のように、Query 操作中にインスタンスがロードされると、 init_on_loadが呼び出されます。

于 2013-04-22T21:38:02.460 に答える