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

时间:2015-08-04 03:24:50

标签: python flask flask-sqlalchemy flask-login

我正在尝试插入一对多的关系。摘自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模型并在地址模型上设置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()

1 个答案:

答案 0 :(得分:1)

没有必要主动将地址附加到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())

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

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