python - 在 Flask + SQLAlchemy 中设置一对一关系

标签 python mysql sqlalchemy

我正在尝试在两个表之间建立关系,这样我就可以访问 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,但我想得到 'name ' 与之关联的字段。

我发现这行得通:

region = models.Region.query.filter_by(id=REGION_ID).first().name

但这不适用于我的情况,因为我需要从 Flask 模板访问“名称”字段。

有什么想法吗?

最佳答案

这里我基本上使用你的模型,但是: 1) 更改了 FK 列的名称 1) 添加了一个关系(请阅读文档的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)

关于python - 在 Flask + SQLAlchemy 中设置一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280507/

相关文章:

日志分析器中的 PHP 脚本超时

mysql - 使用 SqlAlchemy + python 在日期时间字段上按时间过滤

python - Flask-SQLAlchemy 更新一对多记录

Python 2 __missing__ 方法

Python Pandas groupby 或滚动多年平均汇总统计

mysql - MySQL 中的作用域/复合代理键

php - 只显示今天和 future 的数据

python - sqlalchemy,混合属性案例语句

python - geo_point映射python和StreamSets随Elasticsearch失败

python - pandas.dataframe.fillna : NotImplementedError