2013-04-22 17 views
32

私はFlaskを使用してフォーラムテンプレートを作成しています。フォームを使用してブラウザで新しいスレッドを作成しようとすると、SQLAlchemyはAttributeErrorをスローします。問題は、Forum-to-Threadと1対多数の関係と、スレッド間の関係を1対多の関係に実装しようとしたときに現れました。AttributeError: 'int'オブジェクトに '_sa_instance_state'属性がありません。

models.py

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(32), index=True, unique=True) 
    password = db.Column(db.String(32), index=True) 
    email = db.Column(db.String(120), index=True, unique=True) 
    role = db.Column(db.SmallInteger, default=ROLE_USER) 

    posts = db.relationship('Post', backref='author', lazy='dynamic') 

class Forum(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(128)) 
    description = db.Column(db.Text) 

    threads = db.relationship('Thread', backref='forum', lazy='dynamic') 

class Thread(db.Model): 

    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(128)) 
    author= db.Column(db.String(32)) 
    timestamp = db.Column(db.DateTime) 
    forum_id = db.Column(db.Integer, db.ForeignKey('forum.id')) 

    posts = db.relationship('Post', backref='thread', lazy='dynamic') 

class Post(db.Model): 

    id = db.Column(db.Integer, primary_key=True) 
    body = db.Column(db.Text) 
    timestamp = db.Column(db.DateTime) 
    thread_id = db.Column(db.Integer, db.ForeignKey('thread.id')) 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 

すべての新規投稿/スレッドとviews.py

views.py

@app.route('/forum/id=<id>/submit', methods=['GET','POST']) 
@login_required 
def new_thread(id): 
    form = ThreadForm() 
    forum = Forum.query.filter_by(id=id).first() 
    if form.validate_on_submit(): 
    thread = Thread(title=form.title.data, 
        author=g.user.username, 
        timestamp=datetime.utcnow()) 
    db.session.add(thread) 
    db.session.flush() 
    post = Post(body=form.body.data, 
       timestamp=datetime.utcnow(), 
       thread=thread.id, 
       author=g.user.id) 
    db.session.add(post) 
    db.session.commit() 
    flash('Post successful.') 
    return redirect(url_for('forum_index', id=id)) 
    return render_template('forum/thread_submit.html', title=forum.title, form=form) 

答えて

47

内で処理問題は、このです:

post = Post(body=form.body.data, 
      timestamp=datetime.utcnow(), 
      thread=thread.id, 
      author=g.user.id) 

ORで作業したいMオブジェクトではなく、主キー列:

post = Post(body=form.body.data, 
      timestamp=datetime.utcnow(), 
      thread=thread, 
      author=g.user) 

エラーは、整数がORMオブジェクトとして解釈されていることを意味します。

-1

またそのフィールド名が正しく指していない可能性があります。

class ThreadFrom(FlaskForm): 

    title = StringField('title', [validators.Length(max=128)]) 
    author= StringField('author', [validators.Length(max=32)]) 
    timestamp = DateField() 
    forum = SelectField() 

代わりのforumforum_id

する必要があります
関連する問題