gpt4 book ai didi

python - 我是否需要创建/更新两个模型才能在 Flask 中插入一对多?

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:19 26 4
gpt4 key购买 nike

我正在尝试插入一对多关系。示例取自flask-sqlalchemy :

class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
addresses = db.relationship('Address', backref='person',
lazy='dynamic')

class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(50))
person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

我编写了允许经过身份验证的用户创建新地址的 View 。我正在使用flask-login 来获取经过身份验证的current_user。我想出了(未测试):

import flask.ext.login import login_required, current_user

@app.route('/new_address', methods = ["GET","POST"])
@login_required
def new_address():
address_form = AddressForm()
if address_form.validate_on_submit():
address = Address(email='foo@bar.com', person_id=current_user.id)
user = Person.query.get(current_user.id)
user.addresses.append(address)
db.session.add(address)
db.session.commit()
return redirect(...)
return render_template(...)

有两件事让我困惑。

第一:对于一对多关系,我需要更新两个模型吗?即,将新地址附加到 Person 模型并在 Address 模型上设置 person_id?

第二:如果上述答案是肯定的,有没有办法直接通过 current_user 将新地址附加到 Person 模型上,或者我是否必须使用 current_user 查询 Person 模型。 id,然后像我一样更新该模型?即,

而不是:

user = Person.query.get(current_user.id)
user.addresses.append(address)
db.session.commit()

可以吗:

 current_user.addresses.append(address)
db.session.commit()

最佳答案

无需主动将地址附加到 Person 模型,这作为表设置的一部分嵌入到一对多关系中,并由数据库处理。

下面的代码应该足够了(从您的代码复制,减去冗余操作):

address = Address(email='foo@bar.com', person_id=current_user.id)
db.session.add(address)
db.session.commit()

您可以通过实际添加一些地址并运行来轻松验证您正在添加地址:

print (db.session.query(Address).filter_by(person_id=current_user.id).count())

注意:如果这是在 Flask 内的登录用户上下文之外完成的,只需将 current_user.id 替换为相关的人员 ID 号即可。

您将看到与用户关联的地址数量与您向数据库提交的地址数量一样多。

关于python - 我是否需要创建/更新两个模型才能在 Flask 中插入一对多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31800137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com