web-dev-qa-db-fra.com

SQLAlchemy AttributeError: l'objet 'Query' n'a pas d'attribut '_sa_instance_state' lors de la récupération de la base de données

Le problème tente de récupérer un objet avec des relations à partir de la base de données à l'aide de SQLAlchemy sur Pyramid. Ce que je veux essentiellement, c'est créer les objets que je dois récupérer dans la base de données pour compléter les données nécessaires à une page Web.

Lorsque j'essaie d'accéder à l'url/poll/{id} (en utilisant un identifiant de sondage valide, par exemple:/poll/1) pour obtenir la page, j'obtiens cette erreur: AttributeError: l'objet 'Query' n'a pas d'attribut '_sa_instance_state'. Quelle est l'erreur?

C'est la partie pertinente du modèle:

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

Celui-ci est la partie du code qui me pose problème. Le débogueur pointe vers l'avant-dernière ligne (l'objet 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}

Merci d'avance!

8
ffuentes

qinst est un Query, pas un Question. Vous voulez probablement:

qinst = session.query(Question).filter_by(poll=pinst).one()

ou

qinst = session.query(Question).filter_by(poll=pinst).first()

Vous pouvez également ajouter une backref sur Question pour pouvoir passer de Poll à Question:

class Question(Base):
    ...
    poll = relationship(Poll, backref="question")

qinst = pinst.question
11
univerio