2017-01-11 8 views
1

Я пытаюсь присоединиться к двум таблицам, чтобы иметь возможность связать соответствующую тему с темой. Присоединиться, кажется, работает, но шаблон дает эту ошибку при визуализации:Связанные таблицы lost 'id' attribute

jinja2.exceptions.UndefinedError: 'sqlalchemy.util._collections.result object' has no attribute 'id'

Как я могу обратиться Topic.id после соединения таблиц?

модели

class Topic(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    topic_name = db.Column(db.String(64)) 
    opinions = db.relationship(Opinion, backref='topic') 
    theme_id = db.Column(db.Integer, db.ForeignKey('theme.id')) 

class Theme(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    theme_name = db.Column(db.String(64)) 
    topics = db.relationship(Topic, backref='theme') 

вид

@main.route('/topics', methods=['GET', 'POST']) 
def topics(): 
    topics = db.session.query(Topic, Theme).join(Theme).order_by(Theme.theme_name).all() 
    themes = Theme.query 
    form = TopicForm() 
    form.theme.choices = [(t.id, t.theme_name) for t in Theme.query.order_by('theme_name')] 
    if form.validate_on_submit(): 
     topic = Topic(topic_name=form.topic_name.data, 
        theme_id=form.theme.data) 
     db.session.add(topic) 
    return render_template('topics.html', topics=topics, themes=themes, form=form) 

шаблон HTML jinja2

<table class="table table-hover parties"> 
     <thead><tr><th>Theme</th><th>#</th><th>Name</th><th>Delete</th></tr></thead> 
     {% for topic in topics %} 
     <tr> 
      <td><a href="#">{{ topic.theme_id }}</a></td> 
      <td><a href="#">{{ topic.id }}</a></td> 
      <td><a href="#">{{ topic.topic_name }}<span class="badge">0</span></a></td> 
      <td><a class="btn btn-danger btn-xs" href="{{ url_for('main.delete_topic', id=topic.id) }}" role="button">Delete</a></td> 
     </tr> 
     {% endfor %} 
    </table> 

ответ

2

Alter ваш запрос, чтобы быть:

topics = db.session.query(Topic).join(Theme).order_by(Theme.theme_name).all() 

Использование query(Topic) показывает, что мы заинтересованы в получении Topic значения обратно. Напротив, ваша текущая реализация использует query(Topic, Theme), что указывает на то, что вы заинтересованы в получении кортежей (Topic, Theme).

+0

Спасибо, это было быстрое решение. Четкая разница между двумя реализациями. –