web-dev-qa-db-ja.com

SQLAlchemy AttributeError:データベースから取得するときに、 'Query'オブジェクトに属性 '_sa_instance_state'がありません

問題は、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}

前もって感謝します!

8
ffuentes

qinstQueryではなく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
11
univerio