python - Flask-SQLAlchemy backref 函数和 backref 参数

标签 python flask sqlalchemy flask-sqlalchemy

在 Flask-SQLAlchemy 中,关系方法中的 backref 参数允许您在指定类下声明一个新属性,如其 docs 中的示例所示。 :

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

但是还有一个backref函数:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address',
                                backref=db.backref('person', lazy='joined'), 
                                lazy='dynamic')

在这种情况下,传递给 backref 参数的 backref 函数的作用是什么,尤其是对于多个 lazy 定义?它与 backref='person' 有何不同?

最佳答案

来自 the documentation for Flask models :

backref 也是一种在 Address 类上声明新属性的简单方法。然后,您还可以使用 my_address.person 找到该地址的人。 lazy 定义 SQLAlchemy 何时从数据库加载数据:

select(这是默认设置)意味着 SQLAlchemy 将根据需要使用标准 select 语句一次性加载数据。

joined 告诉 SQLAlchemy 使用 JOIN 语句在与父级相同的查询中加载关系。

subquery 的工作方式类似于“joined”,但 SQLAlchemy 将使用子查询。

如果您有很多项目,

dynamic 是特别有用的。 SQLAlchemy 不会加载项目,而是返回另一个查询对象,您可以在加载项目之前进一步优化该对象。如果您希望这种关系有多个项目,这通常就是您想要的。

关于python - Flask-SQLAlchemy backref 函数和 backref 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44538911/

相关文章:

python - 为循环编写 python 为 while?

python - 为什么 cv2.projectPoints 的行为不如我预期?

python - 为什么 chrome 在错误的子域上设置 cookie?

python - Flask-sqlalchemy 临时 session /上下文变量

python - 在 sqlalchemy 中按 row_number 过滤

python - 访问 python 元组中的特定条目

python - Django新手试图让treeio在apache后面工作

python Flask mysql 仅使用一个连接

javascript - 尽管将 JavaScript 放在静态目录中,但无法将 JavaScript 应用到 Flask 中的模板。我该如何解决下面代码中的问题?

python - SQLAlchemy邻接列表查询