【问题标题】:Do I need to create/update both models to insert a one-to-many in Flask?我是否需要创建/更新两个模型才能在 Flask 中插入一对多?
【发布时间】:2015-08-04 03:24:50
【问题描述】:

我正在尝试插入一对多关系。取自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'))

我编写了允许经过身份验证的用户创建新地址的视图。我正在使用烧瓶登录来获取经过身份验证的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()

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-login


    【解决方案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 号。

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

    【讨论】:

    • 好的,我明白了。对于第二个问题,假设我已经有一个从数据库中获取的地址,并且我想将它附加到经过身份验证的用户。有没有办法通过直接更新current_user 来更新数据库中经过身份验证的用户,或者我必须做我所做的事情(从current_user.id... 获取 Person 模型等)。
    • 您是如何获取地址的?它是否附加到个人 ID?如果不是,它是如何创建的?
    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2015-11-15
    • 2011-08-13
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多