Python Flask SQLalchemy 外键未保存在数据库中 - 一对多
Python Flask SQLalchemy Foreign key isn't saved in database - One to Many
所以我有一个用户可以提交房间的表单,当然一个用户应该可以提交多个房间,但是房间都属于这个用户,所以我们在这里有一个一对多的关系(理解):
room1 - 外键(user1)
房间 2 - 外键(用户 1)
问题:
提交表单时,数据库识别有外键功能但users_id为空,但应该有提交房间的用户的实际id
代码:
我尽量只显示相关的部分
这是我的模型:
class User(UserMixin, Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
# foreign key
addresses = relationship('Zimmer', back_populates="users")
class Zimmer(Base):
__tablename__ = 'zimmer'
id = Column(Integer, primary_key=True)
# foreign key
users_id = Column(Integer, ForeignKey('users.id'))
users = relationship("User", back_populates="addresses")
这是填充数据库的代码:
@app.route("/zimmer_einstellen", methods=['GET', 'POST'])
@login_required
@check_confirmed
def zimmer_einstellen():
form = ZimmerForm()
if form.validate_on_submit():
new_zimmer = Zimmer(art=form.art.data, personen=form.personen.data, preis=form.preis.data, infofeld=form.infofeld.data, land=form.land.data, bundesland=form.bundesland.data,
stadt=form.stadt.data, strasse=form.strasse.data, hausnr=form.hausnr.data, haustiere_erlaubt=form.haustiere_erlaubt.data,
bettwaesche_wird_gestellt=form.bettwaesche_wird_gestellt.data, grill_vorhanden=form.grill_vorhanden.data, safe_vorhanden=form.safe_vorhanden.data, kuehlschrank_vorhanden=form.kuehlschrank_vorhanden.data, rauchen_erlaubt=form.rauchen_erlaubt.data,
parkplatz_vorhanden=form.parkplatz_vorhanden.data, kochmoeglichkeit_vorhanden=form.kochmoeglichkeit_vorhanden.data, restaurant_im_haus_vorhanden=form.restaurant_im_haus_vorhanden.data, handtuecher_werden_gestellt=form.handtuecher_werden_gestellt.data, tv_vorhanden=form.tv_vorhanden.data,
waschmoeglichkeit_vorhanden=form.waschmoeglichkeit_vorhanden.data, wlan_vorhanden=form.wlan_vorhanden.data)
if new_zimmer:
db_session.add(new_zimmer)
db_session.commit()
flash('Zimmer wurde erfolgreich eingestellt')
return redirect(url_for('zimmer_einstellen'))
else:
flash('Etwas ist schief gelaufen mit dem Einstellen des Zimmers')
return render_template('zimmer_einstellen.html', form=form)
但据我所知,创建外键关系就足够了,应该就是这样。
或者我是否必须在 html 的实际形式中使用诸如附加隐藏标签之类的东西,这通常是我使用的(没有所有其他输入):
<form id="regi" method="POST" action="{{ url_for('zimmer_einstellen', next=request.args.get('next')) }}">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.art.label }}
{{ form.art(size=30, class = "form-control") }}
</div>
</div>
<div class="col-lg-12 col-md-12">
<button type="submit" class="btn btn-success"> Zimmer einstellen </button>
</div>
如果我对你的问题的理解正确,那么你还没有用正确的 users_id 创建 Zimmer 对象:
你需要做这样的事情:
new_zimmer = Zimmer(..., users_id=user_id)
并且由于您无权访问 users_id,因此您需要获取它。您提到的一种选择是将其作为隐藏输入放入 html 中,然后将其放入 zimmer_einstellen 函数中。
更新:根据您的 User 声明,我猜您正在使用提供 current_user 的 Flask-Login 扩展在你的应用程序中。如果是这种情况,您可以在视图中使用 current_user.id 来获取当前用户的 ID。
所以我有一个用户可以提交房间的表单,当然一个用户应该可以提交多个房间,但是房间都属于这个用户,所以我们在这里有一个一对多的关系(理解):
room1 - 外键(user1) 房间 2 - 外键(用户 1)
问题:
提交表单时,数据库识别有外键功能但users_id为空,但应该有提交房间的用户的实际id
代码:
我尽量只显示相关的部分
这是我的模型:
class User(UserMixin, Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
# foreign key
addresses = relationship('Zimmer', back_populates="users")
class Zimmer(Base):
__tablename__ = 'zimmer'
id = Column(Integer, primary_key=True)
# foreign key
users_id = Column(Integer, ForeignKey('users.id'))
users = relationship("User", back_populates="addresses")
这是填充数据库的代码:
@app.route("/zimmer_einstellen", methods=['GET', 'POST'])
@login_required
@check_confirmed
def zimmer_einstellen():
form = ZimmerForm()
if form.validate_on_submit():
new_zimmer = Zimmer(art=form.art.data, personen=form.personen.data, preis=form.preis.data, infofeld=form.infofeld.data, land=form.land.data, bundesland=form.bundesland.data,
stadt=form.stadt.data, strasse=form.strasse.data, hausnr=form.hausnr.data, haustiere_erlaubt=form.haustiere_erlaubt.data,
bettwaesche_wird_gestellt=form.bettwaesche_wird_gestellt.data, grill_vorhanden=form.grill_vorhanden.data, safe_vorhanden=form.safe_vorhanden.data, kuehlschrank_vorhanden=form.kuehlschrank_vorhanden.data, rauchen_erlaubt=form.rauchen_erlaubt.data,
parkplatz_vorhanden=form.parkplatz_vorhanden.data, kochmoeglichkeit_vorhanden=form.kochmoeglichkeit_vorhanden.data, restaurant_im_haus_vorhanden=form.restaurant_im_haus_vorhanden.data, handtuecher_werden_gestellt=form.handtuecher_werden_gestellt.data, tv_vorhanden=form.tv_vorhanden.data,
waschmoeglichkeit_vorhanden=form.waschmoeglichkeit_vorhanden.data, wlan_vorhanden=form.wlan_vorhanden.data)
if new_zimmer:
db_session.add(new_zimmer)
db_session.commit()
flash('Zimmer wurde erfolgreich eingestellt')
return redirect(url_for('zimmer_einstellen'))
else:
flash('Etwas ist schief gelaufen mit dem Einstellen des Zimmers')
return render_template('zimmer_einstellen.html', form=form)
但据我所知,创建外键关系就足够了,应该就是这样。
或者我是否必须在 html 的实际形式中使用诸如附加隐藏标签之类的东西,这通常是我使用的(没有所有其他输入):
<form id="regi" method="POST" action="{{ url_for('zimmer_einstellen', next=request.args.get('next')) }}">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.art.label }}
{{ form.art(size=30, class = "form-control") }}
</div>
</div>
<div class="col-lg-12 col-md-12">
<button type="submit" class="btn btn-success"> Zimmer einstellen </button>
</div>
如果我对你的问题的理解正确,那么你还没有用正确的 users_id 创建 Zimmer 对象: 你需要做这样的事情:
new_zimmer = Zimmer(..., users_id=user_id)
并且由于您无权访问 users_id,因此您需要获取它。您提到的一种选择是将其作为隐藏输入放入 html 中,然后将其放入 zimmer_einstellen 函数中。
更新:根据您的 User 声明,我猜您正在使用提供 current_user 的 Flask-Login 扩展在你的应用程序中。如果是这种情况,您可以在视图中使用 current_user.id 来获取当前用户的 ID。