在 Flask + SQLAlchemy 中设置一对一关系
setup relationship one-to-one in Flask + SQLAlchemy
我正在尝试在两个 table 之间建立关系,这样我就可以访问 obj1。obj2.name 其中 obj1 是一个 table,obj2 是另一个 table。关系是一对一的(一个人对一个地理区域)
# Table one (Person)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
region = db.Column(db.Integer, db.ForeignKey('region.id'))
# Table two (Region)
class Region(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
如果我使用 Person.region(其中 Person 是 Person class 的一个对象)我得到区域主键的 int用户,但我想获取与之关联的 'name' 字段。
我发现这行得通:
region = models.Region.query.filter_by(id=REGION_ID).first().name
但这不适用于我的情况,因为我需要从 Flask 模板访问 'name' 字段。
有什么想法吗?
这里我基本上使用你的模型,但是:
1) 更改了 FK 列的名称
1) 添加了 relationship
(请阅读文档的 Relationship Configuration 部分)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
# @note: renamed the column, so that can use the name 'region' for
# relationship
region_id = db.Column(db.Integer, db.ForeignKey('region.id'))
# define relationship
region = db.relationship('Region', backref='people')
class Region(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
有了这个你就可以得到区域名称如下:
region_name = my_person.region.name # navigate a 'relationship' and get its 'name' attribute
为了确保区域与人物同时从数据库中加载,您可以使用joinedload
选项:
p = (db.session.query(Person)
.options(db.eagerload(Person.region))
.get(1)
)
print(p)
# below will not trigger any more SQL, because `p.region` is already loaded
print(p.region.name)
我正在尝试在两个 table 之间建立关系,这样我就可以访问 obj1。obj2.name 其中 obj1 是一个 table,obj2 是另一个 table。关系是一对一的(一个人对一个地理区域)
# Table one (Person)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
region = db.Column(db.Integer, db.ForeignKey('region.id'))
# Table two (Region)
class Region(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
如果我使用 Person.region(其中 Person 是 Person class 的一个对象)我得到区域主键的 int用户,但我想获取与之关联的 'name' 字段。
我发现这行得通:
region = models.Region.query.filter_by(id=REGION_ID).first().name
但这不适用于我的情况,因为我需要从 Flask 模板访问 'name' 字段。
有什么想法吗?
这里我基本上使用你的模型,但是:
1) 更改了 FK 列的名称
1) 添加了 relationship
(请阅读文档的 Relationship Configuration 部分)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
# @note: renamed the column, so that can use the name 'region' for
# relationship
region_id = db.Column(db.Integer, db.ForeignKey('region.id'))
# define relationship
region = db.relationship('Region', backref='people')
class Region(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
有了这个你就可以得到区域名称如下:
region_name = my_person.region.name # navigate a 'relationship' and get its 'name' attribute
为了确保区域与人物同时从数据库中加载,您可以使用joinedload
选项:
p = (db.session.query(Person)
.options(db.eagerload(Person.region))
.get(1)
)
print(p)
# below will not trigger any more SQL, because `p.region` is already loaded
print(p.region.name)