我试图在两个表之间建立一个关系,使我可以到达obj1.obj2.name,其中obj1是一个表,而obj2是另一个表。关系是一对一的(一个人到一个地理区域)
# 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类的对象),则获得用户区域的主键的int,但我想获取与其关联的“名称”字段。
我发现这可以工作:
region = models.Region.query.filter_by(id=REGION_ID).first().name
但这不适用于我的情况,因为我需要从Flask模板访问“名称”字段。
有什么想法吗?
在这里,我基本上使用您的模型,但是: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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句