2017-02-12 5 views
0

Проблема заключается в попытке получить объект с отношениями из базы данных с помощью SQLAlchemy на Pyramid. В основном я хочу создать объекты, которые мне нужно получить из базы данных, чтобы заполнить данные, необходимые для веб-страницы.SQLAlchemy AttributeError: объект «Query» не имеет атрибута «_sa_instance_state» при извлечении из базы данных

Когда я пытаюсь получить доступ к url ​​/ poll/{id} (используя действительный идентификатор опроса, например:/poll/1), чтобы получить страницу, я получаю эту ошибку: AttributeError: объект «Query» не имеет атрибута '_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 

Это одна является частью кода, который дает мне неприятности. Отладчик указывает от второй до последней строки (объект 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} 

Заранее благодарен!

ответ

1

qinst является Query, а не Question. Вы, вероятно, хотите:

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

или

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

Вы также можете добавить backref на Question, так что вы можете перейти от Poll к Question:

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

qinst = pinst.question 
+0

Я просто изображал .one() или первой(), но я рад за тщательное разъяснение. Кажется гораздо лучше использовать backref. – ffuentes

Смежные вопросы