插入新记录与SQLAlchemy的一个一对多的关系(Inserting new records wi

2019-09-02 05:15发布

我正在关注的烧瓶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'))

现在,我不知道如何使用这些模型来插入新记录到数据库。 我想我需要一个构造函数初始化 ,但我有困难的理解它应该如何实现和使用。 这里对我来说,主要的问题是,人依赖于地址和地址ForeignKey的到的人,所以应该知道事先的人。

Plase帮助我了解应该如何进行。

先感谢您。

Answer 1:

你不需要写一个构造函数,您可以治疗addresses上的属性Person实例作为一个列表:

a = Address(email='foo@bar.com')
p = Person(name='foo')
p.addresses.append(a)

或者您也可以通过地址列表的Person构造

a = Address(email='foo@bar.com')
p = Person(name='foo', addresses=[a])

在这两种情况下,你就可以访问该地址上的Person比如像这样:

db.session.add(p)
db.session.add(a)
db.session.commit()
print p.addresses.count() # 1
print p.addresses[0] # <Address object at 0x10c098ed0>
print p.addresses.filter_by(email='foo@bar.com').count() # 1


Answer 2:

在某些情况下是有喜欢“清单对象没有属性_sa_instance_state”异常。

a = Address(email='foo@bar.com')
p = Person(name='foo', addresses=a)

解决这个例外。



Answer 3:

而寻找到这种模式,最重要的是要了解一个事实,即这种模式有一个一对多的关系,即一人多个地址,我们将这些地址存储在我们的案例列表。

所以,用其init Person类会是这个样子。

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')

    def __init__(self,id,name,addresses = []):
        self.id = id
        self.name = name
        self.addresses = addresses

因此,这Person类将被期待的ID,名称和包含类型地址的对象列表。 我一直默认值是一个空列表。

希望能帮助到你。 :)



文章来源: Inserting new records with one-to-many relationship in sqlalchemy