我正在关注的烧瓶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帮助我了解应该如何进行。
先感谢您。
你不需要写一个构造函数,您可以治疗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
在某些情况下是有喜欢“清单对象没有属性_sa_instance_state”异常。
a = Address(email='foo@bar.com')
p = Person(name='foo', addresses=a)
解决这个例外。
而寻找到这种模式,最重要的是要了解一个事实,即这种模式有一个一对多的关系,即一人多个地址,我们将这些地址存储在我们的案例列表。
所以,用其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,名称和包含类型地址的对象列表。 我一直默认值是一个空列表。
希望能帮助到你。 :)