2017-02-12 3 views
0

Le problème est d'essayer de récupérer un objet avec des relations de la base de données à l'aide de SQLAlchemy sur Pyramid. Ce que je veux essentiellement, c'est créer les objets dont j'ai besoin de récupérer dans la base de données pour compléter les données nécessaires pour une page web. Lorsque j'essaie d'accéder à l'url/poll/{id} (en utilisant un identifiant d'interrogation valide, par exemple:/poll/1) pour obtenir la page, j'obtiens cette erreur: AttributeError: l'objet 'Query' n'a aucun attribut '_sa_instance_state'. Quelle est l'erreur?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

Ceci 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 donne du mal. Le débogueur pointe sur 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!

Répondre

1

qinst est un Query, et non un Question. Vous voulez sans doute:

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

ou

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

Vous pouvez également ajouter un backref sur Question vous pouvez donc aller de Poll à Question:

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

qinst = pinst.question 
+0

Je viens de comprendre la .one() ou première chose() mais je suis heureux pour la clarification approfondie. Il semble beaucoup mieux d'utiliser le backref. – ffuentes