我正在使用Flask开发论坛模板。当我尝试使用表单在浏览器中创建新线程时,SQLAlchemy抛出AttributeError。当我尝试与论坛到线程实现一对多关系以及与线程到用户实现一对多关系时,出现了问题。
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)
问题是这样的:
post = Post(body=form.body.data, timestamp=datetime.utcnow(), thread=thread.id, author=g.user.id)
你要使用ORM对象,而不是主键列:
post = Post(body=form.body.data, timestamp=datetime.utcnow(), thread=thread, author=g.user)
该错误表示整数被解释为ORM对象。