如何通过sqlalchemy为外键字段输入值

2024-04-20 04:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有模型:

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()

这是正确的。你知道吗

但是如果我想通过'邮政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'

Tags: formiddbdatamodelsessioncommentbody
2条回答
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表中。你知道吗

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的post是否存在

相关问题 更多 >