我是否需要 create/update 两个模型才能在 Flask 中插入一对多?
Do I need to create/update both models to insert a one-to-many in Flask?
我正在尝试插入一对多关系。取自 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'))
我编写了允许经过身份验证的用户创建新地址的视图。我正在使用 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.id
查询 Person 模型,然后像我一样更新那个模型?
即,
而不是:
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 号即可。
您将看到与您提交给数据库的用户关联的地址数量。
我正在尝试插入一对多关系。取自 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'))
我编写了允许经过身份验证的用户创建新地址的视图。我正在使用 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.id
查询 Person 模型,然后像我一样更新那个模型?
即,
而不是:
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 号即可。
您将看到与您提交给数据库的用户关联的地址数量。