問題は、PyramidでSQLAlchemyを使用して、データベースから関係を持つオブジェクトを取得しようとしていることです。基本的には、データベースから取得する必要があるオブジェクトを作成して、Webページに必要なデータを完成させる必要があります。
/ poll/{id}のURLにアクセスして(有効なポーリングID、たとえば/ poll/1を使用して)ページを取得しようとすると、次のエラーが発生します。AttributeError: 'Query' object has no attribute '_sa_instance_state'。間違いは何ですか?
これはモデルの関連部分です:
class Question(Base):
__tablename__ = 'question'
id = Column(Integer, primary_key=True)
text = Column(String(250))
type_id = Column(Integer, ForeignKey('type.id'))
type = relationship(Type)
poll_id = Column(Integer, ForeignKey('poll.id'))
poll = relationship(Poll)
def __init__(self, text, type, poll):
self.text = text
self.type = type
self.poll = poll
class Option(Base):
__tablename__ = 'option'
id = Column(Integer, primary_key=True)
text = Column(String(250))
question_id = Column(Integer, ForeignKey('question.id'))
question = relationship(Question)
def __init__(self, text, question):
self.text = text
self.question = question
これはコードの一部で、問題が発生します。デバッガーは最後から2行目(Optionオブジェクト)を指します。
if request.matchdict['id'] != None:
pinst = session.query(Poll).get(request.matchdict['id'])
typeq = session.query(Type).first()
qinst = session.query(Question).filter_by(poll=pinst)
lopt = session.query(Option).filter_by(question=qinst)
return {'question':qinst, 'arroptions':lopt, 'type':typeq}
前もって感謝します!
qinst
はQuery
ではなくQuestion
です。あなたはおそらく望みます:
qinst = session.query(Question).filter_by(poll=pinst).one()
または
qinst = session.query(Question).filter_by(poll=pinst).first()
Question
からPoll
に移動できるように、Question
に後方参照を追加することもできます。
class Question(Base):
...
poll = relationship(Poll, backref="question")
qinst = pinst.question