【发布时间】:2021-12-27 21:07:50
【问题描述】:
我正在尝试向数据库表中添加一个新元素,但我不断收到此错误。 我的数据库是这样的:
class User(UserMixin, db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(100), unique=True)
password = db.Column(db.String(100))
name = db.Column(db.String(100))
posts = relationship("BlogPost", back_populates="author")
class BlogPost(db.Model):
__tablename__ = "blog_posts"
id = db.Column(db.Integer, primary_key=True)
# Create Foreign Key, "users.id" the users refers to the tablename of User.
author_id = db.Column(db.Integer, db.ForeignKey("users.id"))
# Create reference to the User object, the "posts" refers to the posts property in the User class.
author = relationship("User", back_populates="posts")
title = db.Column(db.String(250), unique=True, nullable=False)
subtitle = db.Column(db.String(250), nullable=False)
date = db.Column(db.String(250), nullable=False)
body = db.Column(db.Text, nullable=False)
img_url = db.Column(db.String(250), nullable=False)
我用来创建新博文的功能是这样的:
form = CreatePostForm()
if form.validate_on_submit():
new_post = BlogPost(
title=form.title.data,
subtitle=form.subtitle.data,
body=form.body.data,
img_url=form.img_url.data,
author=current_user.name,
author_id=current_user.id,
date=date.today().strftime("%B %d, %Y")
)
db.session.add(new_post)
db.session.commit()
return redirect(url_for("get_all_posts"))
return render_template("make-post.html", form=form)
我指定在链接这两个表之前,代码运行良好。当我在两个表之间创建关系时出现问题。
提前感谢您的帮助!
【问题讨论】:
-
您已经定义了一个关系来引用用户(作者)。但是,在您的路线中,您传递用户的名称和用户的 ID。只需将 current_user 作为作者或仅将 current_user.id 作为 author_id 传递,那么它应该可以工作。
-
成功了!!非常感谢,但您能向我解释一下为什么会出现这个错误吗?我是关系数据库主题的新手,我不确定我是否理解其中的逻辑。
-
关系是到另一个模型的虚拟映射。您传递了一个字符串,而不是一个对象的实例。无法使用此信息进行映射。关系基于存储在表列中的 ForeignKey。从现在开始,可以从另一个表中读取引用对象的列。所以你只需要设置代表 ForeignKey 的属性,或者期望关系的对象。如果设置对象,会自动设置 ForeignKey,反之亦然。
-
好的,所以如果我对关系数据库的理解正确,您可以放置外键或链接与父表关系的“变量”。对吗?
标签: flask sqlalchemy flask-sqlalchemy