【问题标题】:Python Flask SQLalchemy Foreign key isn't saved in database - One to ManyPython Flask SQLalchemy 外键未保存在数据库中 - 一对多
【发布时间】:2016-10-10 05:30:48
【问题描述】:

所以我有一个用户可以提交房间的表单,当然一个用户应该可以提交多个房间,但是房间都属于这个用户,所以我们这里是一对多的关系(为了理解):

room1 - 外键(user1) room2 - 外键(user1)

问题:

提交表单时,数据库识别出有外键函数但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>

【问题讨论】:

    标签: python python-2.7 flask sqlalchemy foreign-key-relationship


    【解决方案1】:

    如果我正确理解了您的问题,则说明您尚未创建具有正确 users_id 的 Zimmer 对象: 你需要做这样的事情:

    new_zimmer = Zimmer(..., users_id=user_id)
    

    而且由于您无权访问 users_id,因此您需要获取它。您提到的一种选择是将其作为隐藏输入放入您的 html 中,并将其放入 zimmer_einstellen 函数中。

    更新:从您的 User 声明中,我猜您正在使用 Flask-Login 扩展,它在您的应用程序中提供了一个 current_user。如果是这种情况,您可以在视图中使用 current_user.id 来获取当前用户的 id。

    【讨论】:

    • 啊好吧,这有助于我了解我可以尝试什么,我现在有一些想法!
    • 所以我必须将 users_id 从 Zimmer 模型移到 init 中,对吗?
    • 是的,您可以通过将 self.users_id = user_id 放入 Zimmer 模型的 init 中来实现。但如您所知,您应该在每次创建 zimmer 对象时将 users_id 传递给 Zimmer。
    • 是的,这就是我所做的。我将 users_id 移动到 init,所以我有 self.users_id = users_id。然后在创建 Zimmer 对象之前,我使用了 users_id = current_user.id。 Zimmer 对象的最后一个参数是 users_id = users_id。谢谢,这行得通。
    • 很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2021-12-26
    • 1970-01-01
    • 2021-06-05
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多