我正在使用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)
答案 0 :(得分:58)
问题是:
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对象。
答案 1 :(得分:-2)
也可能是字段名称未正确指向:
class ThreadFrom(FlaskForm):
title = StringField('title', [validators.Length(max=128)])
author= StringField('author', [validators.Length(max=32)])
timestamp = DateField()
forum = SelectField()
而不是forum
应该是forum_id