如何通过sqlalchemy输入foriegn关键字段的值

时间:2015-06-22 19:50:18

标签: python flask sqlalchemy flask-sqlalchemy

我有模特:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    body = db.Column(db.String(2000))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    comments = db.relationship('Comment', backref='parent_post', lazy='dynamic')


class Comment(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    body = db.Column(db.String(140))
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))

在向数据库输入帖子时,我这样做:

if form.validate_on_submit():
      post = Post(body=form.post.data, author=g.user)
      db.session.add(post)
      db.session.commit()

这是正常的。

但是,如果我想传递&post; id.id'如何输入对数据库的评论?价值直接 而不是对象' post'。 (无法通过html中的表单传递'对象)

if form.validate_on_submit():
      comment = Comment(body=form.post.data, parent_post=form.p_id.data)
      db.session.add(comment)
      db.session.commit()

目前p_id保留了值post.id并且它给了我错误:

AttributeError: 'int' object has no attribute '_sa_instance_state'

2 个答案:

答案 0 :(得分:2)

Comment.parent_post是一个关系,由整数列Comment.post_id支持。目前,您正在尝试为该关系分配一个int(来自form.p_id)。为该列分配一个int或为该关系分配Post实例。

comment = Comment(post_id=form.p_id.data, body=form.post.data)
# or
post = Post.query.get_or_404(form.p_id.data)
comment = Comment(parent_post=post, body=form.post.data)

第二种方式更可取,因为在尝试使用id之前验证了具有id的帖子。

答案 1 :(得分:0)

if form.validate_on_submit():
      comment = Comment(body=form.post.data, parent_post=form.p_id.data)
      ### you need to add `comment` instead `post` in the line below
      db.session.add(comment)
      db.session.commit()

我强烈认为错误是因为db.session.add(post)。添加评论时,请db.session.add(post)db.session.add(comment)

请确保通过表单传递的POST-ID存在于post表中。