2013-04-22 47 views
32

Tôi đang làm việc trên mẫu diễn đàn bằng Flask. Khi tôi cố gắng tạo một luồng mới trong trình duyệt bằng cách sử dụng các biểu mẫu, SQLAlchemy ném một AttributeError. Vấn đề xuất hiện khi tôi thử triển khai một mối quan hệ một-nhiều với Diễn đàn-to-Chủ đề và mối quan hệ một-nhiều giữa Chủ đề và Người dùng.Thuộc tínhError: đối tượng 'int' không có thuộc tính '_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')) 

Tất cả các bài viết mới/bài và xử lý trong 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) 

Trả lời

47

vấn đề là thế này:

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

bạn muốn làm việc với OR Đối tượng M, không phải cột chính chính:

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

lỗi có nghĩa là một số nguyên đang được hiểu là đối tượng ORM.

-1

Nó có thể là cũng là tên trường không chỉ một cách chính xác:

class ThreadFrom(FlaskForm): 

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

Thay vì forum nên forum_id

Các vấn đề liên quan